How does a "finalizer guardian" [Effective Java , page 30] work ?
Have you used them? Did it solve any specific开发者_如何学Go problem ?
It solves the problem of the sub-class forgetting to call the finalize
method of the super-class. This pattern works by attaching an extra instance with overridden finalize
to your super-class. This way, if the super-class goes out of scope, the attached instance would also go out of scope, which would trigger the execution of its finalize
, which would in turn call the finalize
of the enclosing class.
Here is a short snippet that showcases the guardian pattern in action:
public class Parent {
public static void main(final String[] args) throws Exception {
doIt();
System.gc();
Thread.sleep(5000); // 5 sec sleep
}
@SuppressWarnings("unused")
private final Object guardian = new Object() {
@Override protected void finalize() {
doFinalize();
}
};
private void doFinalize() {
System.out.println("Finalize of class Parent");
}
public static void doIt() {
Child c = new Child();
System.out.println(c);
}
}
class Child extends Parent {
// Note, Child class does not call super.finalize() but the resources held by the
// parent class will still get cleaned up, thanks to the guardian pattern
@Override protected void finalize() {
System.out.println("Finalize of class Child");
}
}
精彩评论