Effective Java讀書筆記 第二章: Creating And Destroying Objects

Item 1,考慮使用靜態工廠方法而不是構造方法來創建對象

好處

1.使用重載構造方法並不是一個好主意,有時候你根本記不清哪個是哪個。可以嘗試用靜態方法來返回一個類的對象,只要取名得當,可讀性可以增強。如果一個類需要多個構造方法,那麼你可以考慮使用不同的靜態方法來替代它們,並且分別使用可讀性很強的方法名,這樣使用者並不需要去查閱相關的文檔就可以直接使用。

2.使用靜態方法相對於構造器來說還有一個好處就是,這樣並不要求你每次調用都創建一個新的對象。尤其是當創建對象的開銷很大的時候,可以大大地提升程序的性能。

舉個例子,Collections類的構造函數其實是private的,爲什麼呢,因爲該類的作用本身是創建其它容器類,並不需要其自身,所以爲了減少對象創建的開銷,就強制無法創建Collections對象。

3.使用靜態方法的第三個好處,和構造方法不一樣的是,除了可以返回該類本身的實例,還可以返回該類的子類的實例,這樣爲程序帶來了很大的靈活性。

壞處

1.那些沒有public或者protected構造函數的類無法被繼承,那麼無論這個類寫得再好,也無法實現重用。

2.用來創建對象的靜態方法和其它的靜態方法並沒有進行區分。但是呢,如果名稱使用得當,可以減少這個問題帶來的影響。比如,valueOf和getInstance兩個方法漸漸的就被普遍使用。常常使用String.valueOf(參數),比如傳遞一個整型,或者任意對象,然後得到其值。常常使用一個類的getInstance來創建一個其對象。


如果沒有特殊的要求,還是使用構造函數。


Item 2,使用private構造函數來強制實行Singleton

Singleton有2種方式可以實現,原理都是使用一個public static的該類的對象加上一個private的構造函數。

第一種:

直接創建一個public static final Something INSTANCE = new Something();

然後將來要調用就簡單地使用Something.INSTANCE就行


第二種:

當然,還是要創建一個上面的變量,然後添加一個static方法

public static final Something getInstance(){

    return INSTANCE;

}


第一種可能更加直觀

第二種更加靈活,將來你要是不想將它弄成Singleton了,可以不用修改API。


Item 4,避免重複創建對象

舉個簡單的例子,String s = new String("creating a string object");

上面的語句每次都會創建一個String對象(如果是第一次調用,會在常量池中創建一個字符串常量),我們真正需要使用到的,其實是這個字符串常量,而這個字符串對象s並不需要每次都創建一個新的,假如該語句頻繁地被調用,就會創建很多沒有實際用途的對象,浪費系統資源。

在類的方法中,我們有時候會無意識地去創建一些局部對象變量,有時候這些變量也許只是一個常量值,一旦初始化,就不需要再創建了。所以有時候我們在創建局部的對象變量的時候最好多想想,這個方法是不是可能會被頻繁地調用,這個局部變量是不是可以寫成成員變量,或者static成員變量,然後是不是可以簡單地通過構造方法或者static代碼塊就初始化了。將來遇到方法調用的時候,只是賦值或者簡單地使用這些變量就行了,就避免了不必要的對象創建。

Java語言本身也提供了很多靜態方法,使得你只用創建一次對象,而不是老在創建。比如Boolean.valueOf(String s),無論你使用多少次該方法,都只會創建一個Boolean對象,減少了系統的負擔。

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