effective java之建立與銷燬對象

    最近朋友推薦了一本書《Effective Java》,以爲寫得不錯,寫點總結筆記,以備後用。 java

1、建立對象 面試

    一、考慮靜態工廠代替構造器 數組

    優勢:(1)有明確名稱。能夠理解成,定義的靜態方法能夠給出明確的名稱,而不是像構造器只有類名。 框架

            (2)可實現單例,沒必要每次建立新對象。這就不解釋了,單例模式 工具

            (3)靜態工廠能夠返回該類的子類。很犀利,相似靜態工廠模式,返回但願的子類。固然,這其中提到了一個服務提供者框架,暫時只能理解個大概,往後再仔細梳理下,寫個總結。 學習

            (4)使代碼更簡潔。例如: 優化

Map<String,List<String>> map=new HashMap<String,List<String>>();
//靜態方法後
public static <k,v> HashMap<k,v> getInstance(){
    return new HashMap<k,v>();
}

     缺點:類若是不含有公有或者受保護的構造器,就不能被子類化。可是,正由於這樣,咱們卻提倡複合替代繼承。即經過委託對象去實現繼承。感受說的缺點又變成優勢啦。。。 ui

    二、Builder模式替代重疊構造器 線程

    當出現多個屬性,例若有10個屬性,但每一個用戶使用屬性的組合都不一致,這個時候怎麼辦? code

    最早想到的是給出全部種類的構造器。這個方法很糟糕,咱們將給出很是多的構造器,用戶調用時也可能出錯。

    固然咱們可使用javabean的setter方法,可是書中提到構造器會被分到幾個調用中,致使javabean處於不一致狀態。說的這種狀況沒遇到過,也只能囫圇吞棗啦  - -

    那麼在這種極端的狀況下推薦使用Builder模式,下次給出demo鏈接。

    三、推薦使用枚舉實現單例。爲了實現單例對象的序列化,光「implements Serializable」是不夠的,還需聲明全部實例域都是瞬時的,光讀着就以爲麻煩!可喜的,枚舉emun無償的提供了序列化機制。

    四、經過私有構造器限制實例化對象。例如咱們在使用工具類的時候,我根本不須要工具類的對象,只是須要工具類的方法,但java中方法又不能單獨存在,只能依據類或對象存在。因此咱們把工具類的構造器私有化,前提是你不想繼承該工具類。經過驗證java.lang.Math 類的構造就是私有的。這點還真學習到了。

    五、避免建立沒必要要的對象

    String str=new String("kyle1970");   //不要這麼作,原本java就給咱們字符池來優化字符串的建立與使用,這樣作很是糟糕,多建立一個毫無心義的對象,但面試題又非要考這些。

    建議讀取配置文件的時候,必定放在靜態代碼塊裏,不要放在對象方法裏

2、銷燬對象

    一、消除過時對象引用。例如咱們在定義一個數組array[size] 當咱們進行數組長度減1的操做array[size--],那麼這個時候將產生一個過時引用,即原來的array[size]這個對象雖然被剔除了數組中,可是它卻不會被垃圾回收器回收,由於它被引用着,這就叫過時引用,將會一直在內存中。

    那這個時候怎麼辦呢?咱們能夠在剔除元素操做以後,寫一句array[size]=null;即把元素剔除後,在把元素的引用設置成null,那麼被剔除對象就會被垃圾回收器回收啦。暈了嗎???

    二、避免使用 fialeze 方法。fialize方法是在對象被垃圾回收器回收前的必要操做。首先,fialize方法因爲線程優先級的緣由,不能保證被調用,可能會產生阻塞,致使內存溢出。其次,調用fialize並不能終結父類。

 

 

行吧,暫時總結到這,後續慢慢補充。

相關文章
相關標籤/搜索