Как работает «хранитель финализатора» [Effective Java, стр. 30]?
Вы использовали их? Решил ли он какую-то конкретную проблему?
Как работает «хранитель финализатора» [Effective Java, стр. 30]?
Вы использовали их? Решил ли он какую-то конкретную проблему?
Это решает проблему подкласса, забывшего вызвать метод 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");
}
}
Parent.finalize()
позвонить Parent.doFinalize()
? Разве это не приводит к тому, что doFinalize()
вызывается дважды, если Child
действительно вызывает super.finalize()
или если завершен экземпляр Parent
?
- person Michael Anderson; 24.06.2014
finalize
. Отредактировано.
- person Sanjay T. Sharma; 28.07.2014
super
finalize ?
- person Pacerier; 18.09.2017