How does a "finalizer guardian" [Effective Java , page 30] work ?
Have you used them? Did it solve any specific problem ?
How does a "finalizer guardian" [Effective Java , page 30] work ?
Have you used them? Did it solve any specific 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");
}
}
Parent.finalize()
call Parent.doFinalize()
? Doesn't that result in doFinalize()
getting called twice if the Child
does call super.finalize()
or if an instance of Parent
is finalized? –
Arjun finalize
method overridden. Edited. –
Laspisa super
finalize ? –
Gluteal © 2022 - 2024 — McMap. All rights reserved.