「ファイナライザー ガーディアン」 [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");
}
}