註冊 | 登入 | 全文檢索 | 排行榜 |
![]() |
» JWorld@TW
» Software Design
» Effective Java
![]() ![]() |
![]() ![]() ![]() ![]() |
本主題所含的標籤 |
作者 | [Effective Java] 條款6 : 避免使用 finalizers (終結式) [精華] | ||
metavige
![]() 麥塔.米奇 版主 ![]() 發文: 2133 積分: 10 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Finalizers (終結式)不可預期, 因此往往帶有危險, 而且往往並非必要 老實說 在書中看到這句話 真是有點 Shock !!! 從來沒想到會有這樣的情況 ![]() 但是再繼續看下去, 我大概瞭解為什麼會這樣說了 ----------------------------------------------------------------------------------- 通常 Java 程式設計師會以 try-finally 來達成一些資源回收的動作 但是 沒有任何保證提及 finalizers 會被準時(及時)執行[JLS,12.6] 當在 finalizer 進行一些跟時間有絕對關連的任務 比如說像是檔案的關閉 如果 finalizer 沒有及時關閉, 這樣子如果有下一個程式來存取檔案 就會發生錯誤 「及時執行 finalizer」正是垃圾回收演算法的主要功能之一 但是程式的行為如果取決於 finalizer 的及時性 可能會變的不穩定 然後就有可能有一種在專案過程中常發生的一種「正常現象」 客戶:為什麼你的程式有問題? 你不是告訴我說你昨天改好了嗎? ![]() PG: 對阿, 我昨天明明改好了, 我在我自己的機器上面測試也可以阿? 為什麼到這邊就不行了呢? ![]() 客戶:這我哪知道??? 你們每次都這樣...... (以下省略三千八百六十七句罵人的話.....) 客戶:反正我現在看就是不行, 你就是要幫我改好.....管你搞到幾點 !!! PG: ![]() ![]() ![]() ![]() JLS 規格書不保證 finalizer 被及時執行, 也不保證他們終將被執行 因此絕對(真的嗎 ![]() 如果一個未被捕捉的異常在 finalization 其間被拋出, 該異常將被忽略 而物件的 finalization 亦將結束 [JLS, 12.6] 而那些「物件會封裝某些資源(如檔案或執行緒), 而資源必須被歸還」的 class 只要提供一個「明確終結函式」(explicit termination method), 並要求客戶一旦不需要該 class 的任何實體就喚起該函式 Ex: InputStream.close() or java.util.Timer.close() 那 finalizer 到底有什麼功能? 1. 作為一個安全網, 如果忘記呼叫你所提供的「明確終結函式」 2. 如果 native peer 不持有關鍵資源的話, 則 finalizer 就是用來執行 native peer 的回收 native peers(原生同等物) - 「正常物件藉著 native method 而委託」的一個 native object 老實說.....不懂 finalizer chaining 並不會被自動執行 如果在 class 內有一個 finalizer, 而 subclass 覆寫了它 subclass finalizer 必須手動喚起 superclass finalizer 如果 subclass 不夠嚴謹, 忘記呼叫 superclass finalizer 要防止這樣的動作, 就是為每一個被終結物件創建一個額外物件 這時候就會將終結處理放在一個 anonymous class(匿名類別 ,條款18), 這樣的 class 的實體我們稱為 finalizer guardian 以下的 Code 是參考 [Effective Java]
![]() ![]() 請各位新手參考 論壇規範 跟 Java 新手 FAQ |
話題樹型展開 |
» JWorld@TW » Software Design » Effective Java |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() |