“终结器守卫” [《Effective Java》第30页] 是如何工作的?
您使用过它们吗?它解决了什么具体问题吗?
“终结器守卫” [《Effective Java》第30页] 是如何工作的?
您使用过它们吗?它解决了什么具体问题吗?
它解决了子类忘记调用超类finalize
方法的问题。该模式通过向您的超类附加一个具有覆盖finalize
的额外实例来工作。这样,如果超类超出范围,附加的实例也会超出范围,从而触发其finalize
的执行,进而调用封闭类的finalize
。
下面是展示守护模式的简短代码段:
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()
是否应该调用Parent.doFinalize()
?如果Child
调用super.finalize()
或者Parent
的实例被finalize,那么这样做会导致doFinalize()
被调用两次,对吗? - Michael Andersonfinalize
方法。已编辑。 - Sanjay T. Sharmasuper
finalize的契约吗? - Pacerier