JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modeno previous topicgo to next topic
本主題所含的標籤
作者 [Effective Java] 條款6 : 避免使用 finalizers (終結式) [精華]
metavige

麥塔.米奇

版主

發文: 2133
積分: 10
於 2003-10-03 15:45 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Finalizers (終結式)不可預期, 因此往往帶有危險, 而且往往並非必要
老實說
在書中看到這句話
真是有點 Shock !!!
從來沒想到會有這樣的情況 Black Eye
但是再繼續看下去, 我大概瞭解為什麼會這樣說了
-----------------------------------------------------------------------------------
通常
Java 程式設計師會以 try-finally 來達成一些資源回收的動作
但是
沒有任何保證提及 finalizers 會被準時(及時)執行[JLS,12.6]
當在 finalizer 進行一些跟時間有絕對關連的任務
比如說像是檔案的關閉
如果 finalizer 沒有及時關閉, 這樣子如果有下一個程式來存取檔案
就會發生錯誤

「及時執行 finalizer」正是垃圾回收演算法的主要功能之一
但是程式的行為如果取決於 finalizer 的及時性
可能會變的不穩定
然後就有可能有一種在專案過程中常發生的一種「正常現象」

客戶:為什麼你的程式有問題? 你不是告訴我說你昨天改好了嗎? Angry
PG: 對阿, 我昨天明明改好了, 我在我自己的機器上面測試也可以阿?
為什麼到這邊就不行了呢? Stupid
客戶:這我哪知道??? 你們每次都這樣......
(以下省略三千八百六十七句罵人的話.....)
客戶:反正我現在看就是不行, 你就是要幫我改好.....管你搞到幾點 !!!
PG: Black Eye ---> (心裡的話: EnvelopeEnvelopeEnvelope)

JLS 規格書不保證 finalizer 被及時執行, 也不保證他們終將被執行
因此絕對(真的嗎Stupid) 不能倚賴 finalizer 更改關鍵的(重要的)永續狀態 (persistent state)

如果一個未被捕捉的異常在 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]
1
2
3
4
5
6
7
8
9
10
11
//Finalizer Guardian idiom
public class Foo {
  //Sole purpose of this object is to finalize outer Foo object
  private final Object finalizerGuardian = new Object() {
    protected void finalize() throws Throwable {
      // Finalize outer Foo object
      .....
    }
  };
  .. //Remainer omitted
}


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
話題樹型展開
人氣 標題 作者 字數 發文時間
18063 [精華] [Effective Java] 條款6 : 避免使用 finalizers (終結式) metavige 2160 2003-10-03 15:45
15611 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) ymshin 648 2003-10-03 21:27
15603 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) metavige 221 2003-10-03 23:39
15483 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) ymshin 145 2003-10-04 15:27
15432 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) popcorny 215 2003-10-04 15:50
15561 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) Duncan 233 2003-10-05 00:20
15137 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) alien 685 2004-06-24 16:37
15473 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) metavige 238 2003-10-06 11:15
15809 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) etman 398 2003-10-29 09:42
15133 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) robot2030 137 2004-11-09 14:08
6201 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) koji 264 2009-02-03 09:13
402 Re:[Effective Java] 條款6 : 避免使用 finalizers (終結式) caterpillar 355 2019-02-25 10:13
» JWorld@TW »  Software Design » Effective Java

reply to postflat modeno previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8