Effective Java讀書筆記二

       

Item 2:當構造函數參數過多時考慮使用Builder來創建對象

 

我們在設計類的時候,有些類難免會有許多的字段(fields),而這些字段可能需要在創建對象的時候對它們進行賦值。一般我們會考慮兩種方式:使用構造函數或者使用setter方法。

使用構造函數的缺點很明顯,如果我們的字段過多,那麼就會讓構造函數的參數過多,在這種情況下,不但不容易理解和閱讀,而且非常容易出錯(這時候就體現出具名參數的好處了)。另外,對於static factory methods也是一樣的。

而使用setter方法可以減少構造函數的參數,但是需要在對象創建完成後調用setter方法爲其它的字段賦值。這樣就會造成對象狀態的不穩定性,同樣也會存在線程安全性。

 

在上面描述的這種情況下,Joshua建議使用Builder模式來創建對象。使用Builder模式時,可以先用必須的字段創建一個builder對象,然後再調用builder對象的類setter方法來給其它字段賦值。等把需要賦值的字段全部完成後,最後調用builder對象的build方法創建真正我們需要的對象,這樣就能保證我們的對象是immutable的。下面是從書上摘抄出的例子:
有了Builder模式,我們就可以這樣創建NutritionFacts的對象:


從上面的使用中可以看出,Builder模式模擬了具名參數,可以提高代碼的可讀性和維護性,降低使用的風險。

 

不過,Builder模式也有顯著的缺點,最明顯的就是每次創建對象的時候都要額外的創建一個builder對象,這個對於注重性能的系統是一個問題。另外,Builder模式從形式上也要比一般的構造函數複雜。所以Joshua建議除非構造函數的參數很多,而且大部分都是可選的,否則首先還是不要考慮Builder模式。

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