2012-07-07 15 views
7

我讀(某處)finalize()不保證當子類被垃圾收集時調用父類,這是否意味着大多數開發人員覆蓋子類中的finalize()並調用super.finalize()你是否在子類中調用super.finalize()?

+6

有效的Java - 項目7:避免終結器。如果你確實使用了終結器,你應該調用super.finalize()。 – assylias 2012-07-07 22:26:46

+0

那麼當子類被垃圾收集時,finalize()會被調用超類嗎? – user997112 2012-07-07 22:29:50

+3

偉大的文章,我認爲有相關性:[爲什麼Finalize保護](http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/)。 – 2012-07-07 22:30:43

回答

13

Finalize不會自動調用超類。所以,如果你重寫敲定,以確保超類的正確方法得到清理將

protected void finalize() { 
    try { 
     // do subclass cleanup 
    } 
    finally { 
     super.finalize(); 
    } 
} 

看到這個參考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

應該值得注意的是,終結不是很容易預測而你不知道對他們是否運行有任何控制。在最終確定方法中不應該做任何關鍵的事情。一般來說,最好只是對班級進行明確的清理。

3

最好避免依靠finalize清理任何非Java資源(不保證完成調用)。如有可能,請嘗試使用資源(如果使用JDK7)或嘗試最終子句以儘可能地清理其他選項中的資源。如果您要使用finalize,您可以將super.finalize放入try finally塊中。不依靠敲定來清理資源是明智的。

// don't make it public! 
protected void finalize() throws Throwable 
{ 
    try 
    { 
    // custom finalization here 
    } 
    finally 
    { 
    super.finalize(); 
    } 
} 

如果這個想法是清理資源,這將是明智的,也許看看虛引用 - 對象是虛可如果它既不強/弱/軟可及,已經敲定&有在至少一個幻影參考(即對象已完成但尚未回收)。

相關問題