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