2011-07-29 8 views

答えて

16

スーパークラスの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"); 
    } 

} 
+2

しかし、ParentクラスがGC'edされる時が来ると、匿名クラスはParentクラスへの参照を保持し、Parentクラスは匿名クラスへの参照を保持するので、親クラスはGCできませんインスタンスフィールドのリンクを使用します。だから、この循環参照のために親クラスと匿名クラスはどのようにガベージコレクションの対象となるでしょうか? – Geek

+2

@ Geek:Javaには、循環参照によってトリップされないかなり素晴らしいGCがあります。もっと[ここ](http://stackoverflow.com/questions/1910194) –

+0

素晴らしいリンクのおかげで。 – Geek

関連する問題