"ファイナライザーガーディアン" [効果的なJava、30ページ]はどのように機能しますか?「finalizerガーディアン」はどのようにJavaで動作しますか?
あなたはそれらを使いましたか?それは特定の問題を解決しましたか?
"ファイナライザーガーディアン" [効果的なJava、30ページ]はどのように機能しますか?「finalizerガーディアン」はどのようにJavaで動作しますか?
あなたはそれらを使いましたか?それは特定の問題を解決しましたか?
スーパークラスの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クラスがGC'edされる時が来ると、匿名クラスはParentクラスへの参照を保持し、Parentクラスは匿名クラスへの参照を保持するので、親クラスはGCできませんインスタンスフィールドのリンクを使用します。だから、この循環参照のために親クラスと匿名クラスはどのようにガベージコレクションの対象となるでしょうか? – Geek
@ Geek:Javaには、循環参照によってトリップされないかなり素晴らしいGCがあります。もっと[ここ](http://stackoverflow.com/questions/1910194) –
素晴らしいリンクのおかげで。 – Geek
は、それを使用していません。私はファイナライザを書いていないからかもしれない。 – duffymo