學習《Effective JAVA》(二)

第二章 建立和銷燬對象緩存

第3條 用私有構造器或者枚舉類型強化Singleton屬性安全

用私有構造器來保證對象只被實例化一次,使用靜態方法返回這個實例,從而實現singleton。spa

反序列化每次都會生成一個新的實例,要抵禦這種破壞必須保證每一個實例域都是transient,還要提供一個readResovle方法對象

private Object readResovle(){內存

    return INSTANCE;資源

}class

使用枚舉來實現singleton,只須要編寫一個單元素的枚舉類型便可。內存泄漏

第4條 經過私有構造器強化不可實例化能力垃圾回收

只包含靜態域和靜態方法的類不但願被實例化,那麼編寫私有構造器來確保這種狀況。序列化

第5條 避免建立沒必要要的對象

重用不可變對象和已知再也不修改的對象。

注意自動裝箱,避免無心中使用包裝類型而致使的裝箱拆箱過程當中建立多餘的對象。

針對給定對象的特定適配器,無需建立多個適配器實例。(適配器與後備對象的抽象概念的理解暫時不足夠清晰)

重複利用對象會想到使用對象池,但若是對象自己很是輕量,其建立銷燬的消耗反而會比維護對象池要更輕微。

第6條 消除過時的對象引用

若是對象再也不須要被引用,那麼就應該將引用賦值null,從而避免過時對象累積而致使內存泄漏。

緩存中對象過時而未清理,也會致使內存泄漏。

監聽器及其回調,回調完成後,沒有取消註冊,致使內存泄漏。

第7條 避免使用終結方法

盡一切可能不使用終結方法,由於終結方法的調用是不被肯定的。釋放資源不該該依賴終結方法,需顯示地編寫釋放方法,而終結方法只可做爲安全攔截網,而且要finally模塊中調用父類的終結方法,避免異常致使終結方法未能執行而使父類的終結方法未調用。

普通對象經過native方法委託給本地對象,但垃圾回收器不知道本地對象,於是不會被回收。若是本地對等體沒有擁有關鍵資源時,適用終結方法來釋放資源,而當本地對等體擁有關鍵資源時該類應該顯式地擁有一個釋放資源的方法。

相關文章
相關標籤/搜索