Effective Java 學習筆記 使用靜態工廠方法代替構造器
什麼是使用靜態工廠方法代替構造器:建立一個靜態方法,返回值是類的例項
使用靜態工廠方法的好處總結:
1.可以隱藏構造方法,把控物件的建立。可以讓物件是單例,複用已經有的物件,比如Boolean
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE= new Boolean(false);
public static Boolean valueOf(boolean b){ return ( b ? TRUE:FALSE) }
Android 開發中使用SharePrefrences可以繼承它,然後建立一個靜態工廠方法用於建立SharePrefrences的例項,然後每次呼叫的時候都返回這個例項,實現整個程式在執行期間只會建立一個例項。
思考:在什麼時候會不用構造方法,而是直接使用靜態工廠方法。1.對於全域性只需要具體數量例項的類可以新增靜態工廠方法。
2.靜態構造方法的命名比構造方法的命名更加直接醒目,方便呼叫者去呼叫適合自己的構造方法。還解決了引數型別列表相同只能有唯一構造方法的限制
思考:什麼時候使用靜態工廠方法, 初始化引數型別比較複雜,或者說有很多相同型別但是含義不同的引數。可以嘗試使用靜態工廠方法。這樣容易區分和初始化資料。
從名字上就能區分所有的構造方式豈不是更加happy
3.靜態構造方法可以返回原返回型別的任何子型別物件。
思考?什麼時候會想起來用這個?比如說,有一個排序類,它有幾個子排序類繼承於它。當我們想通過不同的排序類進行排序的時候,可以通過呼叫父類的靜態構造方法,這樣就可以隱藏子類排序方法的具體實現,同時也隱藏了這個子類。這樣方法呼叫者在使用排序類的時候的方法是很簡單的。完全和排序實現解耦。如果不這樣做,客戶端要去了解這個基類的所有子類,然後再取篩選用哪個。通過這個方式,客戶端開發人員對於咋實現的,完全懵逼。
還有一個比較大的好處,就是向客戶端提供API的介面就可能會大規模減少,畢竟沒有具體子類的介面了嘛。
4.靜態構造方法,它還簡化引數型別的宣告,這個的效果就是看起來簡單點。
有缺點:
1.沒有公開或者是受保護的(public || protected)的構造方法,不能子類化。(子類都沒法構造了嘛,你就只能使用這個類了。)
2.靜態方法,如果放置不好的話,你不太容易發現它,畢竟它只是個普通的靜態方法,雖然他可以做一些牛逼的事情。