Java终结者监护人似乎不起作用?

Kal*_*Kal 5 java finalize

我有一个带有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中获取.

我糊涂了.我是否从根本上误解了一些事情?

免责声明:我意识到终结器是危险的,不可取的等等.仍然试图在这里理解问题.

axt*_*avt 8

有效的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)