У меня есть суперкласс с телескопическими конструкторами с методом 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.
Я сбит с толку. Я что-то принципиально не понимаю?
Заявление об ограничении ответственности : Я понимаю, что финализаторы опасны и нежелательны и т. Д. Все еще пытаюсь понять проблему.