2011-07-29 33 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化的時候,父類將不能被GC化,因爲匿名類擁有對Parent類的引用,而Parent類也包含對匿名類的引用通過實例字段鏈接。因此,由於此循環引用,Parent和匿名類將如何有資格進行垃圾回收? – Geek

+2

@Geek:Java有一個非常棒的GC,它不會被循環引用觸發。更多[這裏](http://stackoverflow.com/questions/1910194) –

+0

感謝您的真棒鏈接。 – Geek