gpt4 book ai didi

Java finalizer guardian 好像不行?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:04 25 4
gpt4 key购买 nike

我有一个父类(super class),它带有带有 finalize() 方法的伸缩构造函数。为了防止子类忘记调用 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");
}

}

这是一个示例子类 --

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);
}
}

当 s1 对象超出范围时,终结器监护人的 finalize() 被调用,我从子类的 finalize 方法中获取 SYSO,但从未从 super 的 finalize 中获取 SYSO。

我很困惑。我从根本上误解了什么吗?

免责声明:我意识到终结器是危险的并且不可取等。仍在尝试理解这里的问题。

最佳答案

有效的 Java 终结器守护程序应该自己执行必要的终结逻辑(例如,调用执行实际终结的 Super 的某些方法)而不是调用 finalize()方法,因为在您的情况下 Super.this.finalize(); 实际上从子类中调用了重写方法。

另请注意,finalizer guardian 应该是类的一个字段:

public class Super {
private final Object finalizerGuardian = new Object() {
@Override
protected void finalize() {
Super.this.doFinalize();
}
};

private void doFinalize() {
System.out.println("Super finalize");
}
}

关于Java finalizer guardian 好像不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com