我有一个带有telesize()方法的伸缩构造函数的超类.为了防止子类忘记调用super.finalize,我已经编写了一个终结器监护器(EJ Item 7).
public class Super {
public Super() {}
{
Object finalizerGuardian = new Object() {
@Override
protected void finalize() {
System.out.println("Finalizer guardian finalize");
Super.this.finalize();
}
};
}
protected void finalize() {
System.out.println("Super finalize");
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例子类 -
public class Sub extends Super {
public Sub() {}
protected void finalize() {
System.out.println("Sub finalize");
}
public static void main(String[] args)
throws InterruptedException {
if (1 == 1) {
Sub s1 = new Sub();
}
Runtime.getRuntime().gc();
Thread.sleep(10000);
}
}
Run Code Online (Sandbox Code Playgroud)
当s1对象超出范围时,终结器监护人的finalize()被调用,我从子类的finalize方法中获取SYSO,但从未从super的finalize中获取.
我糊涂了.我是否从根本上误解了一些事情?
免责声明:我意识到终结器是危险的,不可取的等等.仍然试图在这里理解问题.
有效的Java终结器监护人应该自己执行必要的终结逻辑(例如,调用一些Super执行实际终结的finalize()方法)而不是调用方法,因为在你的情况下Super.this.finalize();实际上是从子类调用overriden方法.
另请注意,终结者监护人应该是班级的一个领域:
public class Super {
private final Object finalizerGuardian = new Object() {
@Override
protected void finalize() {
Super.this.doFinalize();
}
};
private void doFinalize() {
System.out.println("Super finalize");
}
}
Run Code Online (Sandbox Code Playgroud)