創(chuàng)建和銷毀對(duì)象

第一條:考慮用靜態(tài)工廠方法代替構(gòu)造器。

第二條:遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)造器。

第三條:用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性。

第四條:通過私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力。

第五條:避免創(chuàng)建不必要的對(duì)象。
String s=new String("abcd"); //Don't do this.
改進(jìn)后的版本:
String s="abcd"; //只有一個(gè)String實(shí)例。

構(gòu)造器在每次被調(diào)用是都會(huì)創(chuàng)建一個(gè)新的對(duì)象,而靜態(tài)工廠方法則從不要求這樣做。

除了重用不可變的對(duì)象之外,也可以重用那些已知不會(huì)被修改的可變對(duì)象。

第六條:消除過期對(duì)象的引用。
如果一個(gè)棧先是增加,然后收縮,那么從棧中彈出來的對(duì)象將不會(huì)被當(dāng)做垃圾回收,即使使用棧的程序不再引用執(zhí)行對(duì)象。這是因?yàn)闂?nèi)部維護(hù)著對(duì)這些對(duì)象的過期引用。所謂過期引用就是永遠(yuǎn)不會(huì)被解除的引用。這類問題的修復(fù)方法很簡(jiǎn)單:一旦對(duì)象引用已經(jīng)過期,只需清空這些引用即可。


內(nèi)存泄露的另一個(gè)常見來源是緩存。

內(nèi)存泄露的第三個(gè)常見來源是監(jiān)聽器和其回調(diào)。如果實(shí)現(xiàn)了一個(gè)API,客戶端咋這個(gè)API中注冊(cè)回調(diào),卻沒有顯示地取消注冊(cè),除非采取某些動(dòng)作,否則它們就會(huì)積聚。確?;卣{(diào)被立即當(dāng)做垃圾回收的最佳方法是只保留它們的弱引用,例如,只將它們保存在WeakHashMap中的鍵。

第七條:避免使用終結(jié)方法。
注重時(shí)間的任務(wù)不應(yīng)該由終結(jié)方法來完成。例如,用終結(jié)方法來關(guān)閉已經(jīng)打開的文件,這是嚴(yán)重錯(cuò)誤的,因?yàn)榇蜷_文件的描述符是一種很有限的資源。由于JVM會(huì)延遲執(zhí)行終結(jié)方法,所以大量的文件會(huì)保留在打開狀態(tài),當(dāng)一個(gè)程序再不能打開文件時(shí),它可能運(yùn)行失敗。

不應(yīng)依賴終結(jié)方法來更新重要的持久狀態(tài)。例如,依賴終結(jié)方法來釋放共享資源(比如數(shù)據(jù)庫(kù))上的永久鎖,很容易讓整個(gè)分布式系統(tǒng)垮掉。

使用終結(jié)方法有一個(gè)非常嚴(yán)重的性能損失。


如果類的對(duì)象中封裝的資源(例如文件或者線程)確實(shí)需要終止,只需提供一個(gè)顯示的終結(jié)方法,并要求該類的客戶端在每個(gè)實(shí)例不再有用的時(shí)候調(diào)用這個(gè)方法。該實(shí)例必須記錄下自己是否已經(jīng)被終止:顯示的終止方法必須在一個(gè)私有域中記錄下“該對(duì)象已經(jīng)不再有效”。如果這些方法是在對(duì)象已經(jīng)終止之后被調(diào)用,其他方法就必須檢查這個(gè)域,并拋出IllegalStateException異常。顯示終結(jié)方法通常與try-finally結(jié)構(gòu)結(jié)合起使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容