15

「ファイナライザー ガーディアン」 [Effective Java 、30 ページ] はどのように機能しますか?

それらを使用したことがありますか?特定の問題は解決しましたか?

4

1 に答える 1

19

サブクラス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");
    }

}
于 2011-07-29T12:20:17.050 に答える