Как работает "защитник-финализатор" [Эффективная Java, страница 30]?
Вы использовали их? Решил ли он какую-либо конкретную проблему?
Ответ 1
Решает проблему подкласса, забывая вызвать метод finalize суперкласса. Этот шаблон работает, присоединяя дополнительный экземпляр с переопределенным finalize к вашему суперклассу. Таким образом, если суперкласс выходит за пределы области видимости, вложенный экземпляр также выйдет за пределы области видимости, что вызовет выполнение его finalize, которое, в свою очередь, вызовет finalize охватывающего класса.
Вот короткий фрагмент, который демонстрирует шаблон опекуна в действии:
public class Parent {
public static void main(final String[] args) throws Exception {
doIt();
System.gc();
Thread.sleep(5000); // 5 sec sleep
}
@SuppressWarnings("unused")
private final Object guardian = new Object() {
@Override protected void finalize() {
doFinalize();
}
};
private void doFinalize() {
System.out.println("Finalize of class Parent");
}
public static void doIt() {
Child c = new Child();
System.out.println(c);
}
}
class Child extends Parent {
// Note, Child class does not call super.finalize() but the resources held by the
// parent class will still get cleaned up, thanks to the guardian pattern
@Override protected void finalize() {
System.out.println("Finalize of class Child");
}
}