有效的Java –创建和销毁对象
創(chuàng)建和銷毀對象(第2章)
這是Joshua Blochs的《 有效的Java》第2章的簡短摘要。我僅包括與自己相關(guān)的項目。
靜態(tài)工廠(項目1)
靜態(tài)工廠與構(gòu)造函數(shù)的一些優(yōu)點:
- 工廠方法的名稱為構(gòu)造函數(shù)添加了描述
- 他們可以返回預(yù)先構(gòu)造的對象,而不必總是返回new。
- 他們可以返回聲明的返回類型的任何子類型,甚至是非公共類。
僅使用靜態(tài)工廠(例如,使用私有構(gòu)造函數(shù))的主要缺點是無法對該類進(jìn)行子類化。
用構(gòu)造器代替具有許多參數(shù)的構(gòu)造器(項目2)
調(diào)用具有許多參數(shù)的構(gòu)造函數(shù)可能很麻煩,因為它需要查看方法聲明以了解參數(shù)代表什么。 這使得讀取和調(diào)用這樣的構(gòu)造函數(shù)都很困難。
一種替代方法是使用無參數(shù)構(gòu)造函數(shù)構(gòu)造一個對象,然后使用設(shè)置器設(shè)置所需的字段(JavaBean模式)。 這種方法的缺點是,在設(shè)置不變式時,對象可能處于不一致狀態(tài)。 此外,由于您提供的是setter,因此對象是不可變的,因此很難保證線程安全。
建筑商是第二種選擇,兩全其美。 生成器首先以可讀和緊湊的方式“收集”參數(shù),然后通過首先驗證不變量是正確的來實例化對象。
由于建造者對于小班制可能會顯得過大,因此本書建議將其用于具有四個以上參數(shù)的班級。 請注意,對于構(gòu)造函數(shù)和靜態(tài)工廠而言,構(gòu)造函數(shù)都是替代方法。
與Singelton的一些陷阱(項目3)
- 如果singelton未實現(xiàn)接口,則Singeltons使其難以測試其客戶端,因為您無法模擬出singelton。
- 如果將singeltons設(shè)置為可序列化的 ,則它們不再是singeltons,除非在反序列化時特別注意。
- 實現(xiàn)單例的最佳方法是使用單元素枚舉類型,這避免了序列化的問題。
避免創(chuàng)建不必要的對象(項目5)
創(chuàng)建對象時應(yīng)小心。 重復(fù)使用昂貴的物品,但不要以防御性復(fù)制為代價(出于不變性–項目39)。 應(yīng)優(yōu)先于盒裝基元使用基元,并且在執(zhí)行自動裝箱以消除不必要的對象創(chuàng)建時要格外小心。
消除過時的對象引用(項目6)
這些書顯示了一個堆棧示例,其中彈出項目不會從內(nèi)部數(shù)組中清空,從而使它們成為無法進(jìn)行垃圾回收的過時引用。 內(nèi)存泄漏和過時引用的公共來源:
- 每當(dāng)類管理自己的內(nèi)存時 ,程序員都應(yīng)該對內(nèi)存泄漏發(fā)出警報。
- 忘記緩存條目。 考慮將WeakHashMap用于緩存,該緩存僅在外部引用條目時才保存項目。
- 缺少注銷的監(jiān)聽器和回調(diào) 。 同樣在這里可以使用WeakHashMap 。
翻譯自: https://www.javacodegeeks.com/2017/05/effective-java-creating-destroying-objects.html
總結(jié)
以上是生活随笔為你收集整理的有效的Java –创建和销毁对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache apollo_Apache
- 下一篇: 谁最终需要Java模块?