1. 程式人生 > >[Effective Java]第一話:使用靜態工廠方法代替構造方法

[Effective Java]第一話:使用靜態工廠方法代替構造方法

一、Item 1:Consider static factory methods instead of constructors(使用靜態工廠方法代替構造方法)

優點:

其一、不同於構造方法,靜態工廠方法擁有自己的名字。

1、方便別人能夠閱讀理解;
2、如果書寫者在進行類的書寫的時候進行了構造方法的過載,那麼文件會較難閱讀。並且我們建議一個類的構造方法只需要一個就行了。
3、如果一個類的構造方法具備很多個過載方法,那麼建議使用靜態工廠方法代替這些構造方法,並且謹慎的選擇這些靜態方法的名稱來做標識。

其二、不同於構造方法,靜態方法不需要在每次呼叫類的物件的使用重新進行例項化。(這將允許我們使用那些預先構造好的例項進行呼叫,或者在類例項化成功之後進行快取,從而避免重複的例項化。)

1、如果某個類需要進行經常性的取得其例項,那麼這樣做就能優化效能。(尤其在例項化的時候需要消耗較多的資源。)
2、進行instance-controlled,以便能夠保證這個類是單例化(singleton)實現的,並且保證該類的例項不會存在第二個一模一樣的。
3、如果使用了singleton模式進行設計,那麼該類的摸個一模一樣的例項不會存在第二個,這樣,我們就可以使用“==”操作符來代替“equals”方法,因為“==”的執行效率較之“equals”高,這樣或許能夠提高效能。(Enum就提供了這種保證)

其三、不同於構造方法,靜態工廠方法能夠返回其任意子類的例項,這樣能夠使你靈活的選擇需要例項的類。
其四、減少了對引數型別的宣告。

在構造方法中,你需要顯示的指明你構造方法的引數中的資料型別,並且這需要你在“=”兩遍顯示的指明引數的型別。Map<String, List<String>> m =
new HashMap<String, List<String>>();
但是如果使用靜態的方法則不然,java會根據型別推斷(type inference),編譯器會指明引數的型別。或許在以後1.6之後構造方法也能進行型別推斷,但是現在看來不會。

缺點:

其一:最大的缺點在於如果該類沒有被“public”或者“protected”修飾符進行修飾的話,該類將不能被子類化。 但是塞翁失馬,Java中更為提倡的是組合(composition)而非繼承(inheritance)。

所謂組合就是在某個類中擁有另外一個類的例項物件,通過呼叫這個類的例項物件,從而在該類中達到操縱其他類中方法的功能(類似於在某個類中暴露出其介面方法)。

其二:使用靜態工廠方法或許較難和其他的靜態方法進行區分,因為在API文件中可能存在茫茫多的靜態方法的描述,這樣,我們可能找不到如何初始化該類物件的方法。這樣就和其他的靜態方法之間不具備區別性。

小結,靜態工廠方法和共有的構造方法各有各的優缺點,我們需要注意並瞭解他們的價值所在。通常,靜態工廠方法是更優的,所以,下次在書寫類的時候,不要條件反射式的就寫上共有的構造方法哦!