Как работает «хранитель финализатора» в Java? - PullRequest
13 голосов
/ 29 июля 2011

Как работает «хранитель финализатора» [Effective Java, стр. 30]?

Вы их использовали? Это решило какую-то конкретную проблему?

1 Ответ

18 голосов
/ 29 июля 2011

Это решает проблему того, что подкласс забывает вызвать метод 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");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...