Class CloseGuard
-
- All Implemented Interfaces:
public final class CloseGuardCloseGuard is a mechanism for flagging implicit finalizer cleanup of resources that should have been cleaned up by explicit close methods (aka "explicit termination methods" in Effective Java).
A simple example:
In usage where the resource to be explicitly cleaned up are allocated after object construction, CloseGuard protection can be deferred. For example:class Foo { private final CloseGuard guard = CloseGuard.get(); ... public Foo() { ...; guard.open("cleanup"); } public void cleanup() { guard.close(); ...; } protected void finalize() throws Throwable { try { if (guard != null) { guard.warnIfOpen(); } cleanup(); } finally { super.finalize(); } } }
When used in a constructor calls toclass Bar { private final CloseGuard guard = CloseGuard.get(); ... public Bar() { ...; } public void connect() { ...; guard.open("cleanup"); } public void cleanup() { guard.close(); ...; } protected void finalize() throws Throwable { try { if (guard != null) { guard.warnIfOpen(); } cleanup(); } finally { super.finalize(); } } }openshould occur at the end of the constructor since an exception that would cause abrupt termination of the constructor will mean that the user will not have a reference to the object to cleanup explicitly. When used in a method, the call toopenshould occur just after resource acquisition.Note that the null check on
guardin the finalizer is to cover cases where a constructor throws an exception causing theguardto be uninitialized.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description public interfaceCloseGuard.ReporterInterface to allow customization of reporting behavior.
-
Method Summary
Modifier and Type Method Description static CloseGuardget()Returns a CloseGuard instance. static voidsetEnabled(boolean enabled)Used to enable or disable CloseGuard. static voidsetReporter(CloseGuard.Reporter reporter)Used to replace default Reporter used to warn of CloseGuard violations. static CloseGuard.ReportergetReporter()Returns non-null CloseGuard.Reporter. voidopen(String closer)If CloseGuard is enabled, openinitializes the instance with a warning that the caller should have explicitly called theclosermethod instead of relying on finalization.voidclose()Marks this CloseGuard instance as closed to avoid warnings on finalization. voidwarnIfOpen()If CloseGuard is enabled, logs a warning if the caller did not properly cleanup by calling an explicit close method before finalization. -
-
Method Detail
-
get
static CloseGuard get()
Returns a CloseGuard instance. If CloseGuard is enabled,
#open(String)can be used to set up the instance to warn on failure to close. If CloseGuard is disabled, a non-null no-op instance is returned.
-
setEnabled
static void setEnabled(boolean enabled)
Used to enable or disable CloseGuard. Note that CloseGuard only warns if it is enabled for both allocation and finalization.
-
setReporter
static void setReporter(CloseGuard.Reporter reporter)
Used to replace default Reporter used to warn of CloseGuard violations. Must be non-null.
-
getReporter
static CloseGuard.Reporter getReporter()
Returns non-null CloseGuard.Reporter.
-
open
void open(String closer)
If CloseGuard is enabled,
openinitializes the instance with a warning that the caller should have explicitly called theclosermethod instead of relying on finalization.- Parameters:
closer- non-null name of explicit termination method
-
close
void close()
Marks this CloseGuard instance as closed to avoid warnings on finalization.
-
warnIfOpen
void warnIfOpen()
If CloseGuard is enabled, logs a warning if the caller did not properly cleanup by calling an explicit close method before finalization. If CloseGuard is disabled, no action is performed.
-
-
-
-