Java finalizer guardian не работает?

У меня есть суперкласс с телескопическими конструкторами с методом 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 () вызывается, и я получаю SYSO из метода finalize подкласса, но никогда не получаю его из метода finalize super.

Я сбит с толку. Я что-то принципиально не понимаю?

Заявление об ограничении ответственности : Я понимаю, что финализаторы опасны и нежелательны и т. Д. Все еще пытаюсь понять проблему.

5
задан Kal 12 August 2011 в 14:26
поделиться