Effective Java

Effective Java

創建和銷燬對象

靜態工廠方法代替構造器的優勢

  • 可命名名稱。一個類只有一個指定簽名的構造器,但可以通過改變參數列表中參數順序的不同,提供不同的構造器。但是會調用錯誤的構造器。靜態工廠方法有名稱,以區別於一個類中需要多個帶有相同簽名的構造器。
  • 不必創建新的對象。爲重複的調用返回相同的對象。實例受控的類嚴格控制某個時刻哪些實例應該存在。使得不可變的類確保不會存在兩個相等的實例。
  • 返回原類型的任何子類型的對象。API可以返回對象,不會使得對象的類變成公有的。這項技術適用於基於接口的框架,接口中不可有靜態方法。接口中的方法默認爲抽象方法。抽象方法存在於抽象類中,抽象方法必須被override,而靜態方法不能被override,這是由於靜態方法在類初始化時就已經加載在靜態存儲區。
    • 靜態工廠方法返回對象所屬的類,在編寫包含該靜態工廠方法的類時可以不必存在。這就構成了服務提供者框架(Servie Provider Framework)。三個重要的組件:服務接口,提供者註冊API,服務訪問API和可選的服務提供者接口。
  • 創建參數化類型實例的時候,使得代碼變得更加簡潔。靜態工廠方法,編譯器可以找到類型參數。這就被稱作類型推導。Java8中已經支持。

靜態工廠方法的缺點

  • 類如果不含公有的或者受保護的構造器,就不能被子類化。
  • 與其他靜態方法沒有任何區別。

遇到多個構造器參數時考慮用構建器

如果類的構造器或者靜態工廠中具有多個參數,設計這種類時,Builder模式是不錯的選擇。

用私有構造器或者枚舉類型強化Singleton屬性

通過私有構造器強化不可實例化的能力

避免創建不必要的對象

  • 小對象的構造器只做很少量的顯式工作,小對象的創建和回收動作是非常廉價的。通過維護自己的對象池來避免創建對象,除非對象是非常重量級的。例如數據庫連接池。

消除過期的對象引用

  • Stack類自己管理內存。存儲池包含了elements數組的元素,對象引用單元。數組活動區域中的元素是已分配的,而數組其餘部分的元素則是自由的。但回收器並不知道這一點。因此程序員將非活動部分的情況告訴垃圾回收器,手工清空這些數組元素。
  • 內存泄露的另一個常見來源是緩存。在緩存之外存在對某個項的鍵的引用,該項有意義。那麼就可以用WeakHashMap代表緩存,當緩存中的項過期口,就會被自動刪除。只有當所要的緩存項的生命週期是由該鍵的外部引用而不是由值決定時,WeakHashMap纔是有用的。
  • 內存泄露的第三個常見來源是監聽器和其他回調。確保回調立即被當做垃圾回收的最佳方法是隻保存它們的弱引用,只將它們保存成WeakHashMap中的鍵。

避免使用終結(finalizer)方法

  • 終結方法並不能被保證一定會執行,使用終結方法有非常嚴重的Server性能損失。
  • 顯式的終止方式通常與try-finally結合起來使用,以確保及時終止。
try{

}finally{

}

終結方法的兩種合法用途。第一種用途:對象的所有者忘記調用前面段落中建議的顯式終止方法時,終結方法可以充當安全網。第二種合理用途與對象的本地對等體(native peer)。本地對等體是一個本地對象,普通對象通過本地方法委託給一個本地對象。如果本地對等體擁有必須被及時終止的資源,那麼該類就應該具有一個顯式的終止方法,終止方法可以使本地方法,也可以調用本地方法。

終結方法鏈並不會自動執行。如果類有終結方法,並且子類覆蓋了終結方法,子類的終結方法就必須手工調用超類的終結方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章