我們在設計類的時候,有些類難免會有許多的字段(fields),而這些字段可能需要在建立物件的時候對它們進行賦值。一般我們會考慮兩種方式:使用建構函式或者使用setter方法。
使用建構函式的缺點很明顯,如果我們的字段過多,那麼就會讓建構函式的引數過多,在這種情況下,不但不容易理解和閱讀,而且非常容易出錯(這時候就體現出具名引數的好處了)。另外,對於static factory methods也是一樣的。
在上面描述的這種情況下,joshua建議使用builder模式來建立物件。使用builder模式時,可以先用必須的字段建立乙個builder物件,然後再呼叫builder物件的類setter方法來給其它字段賦值。等把需要賦值的字段全部完成後,最後呼叫builder物件的build方法建立真正我們需要的物件,這樣就能保證我們的物件是immutable的。下面是從書上摘抄出的例子:
有了builder模式,我們就可以這樣建立nutritionfacts的物件:
從上面的使用中可以看出,builder模式模擬了具名引數,可以提高**的可讀性和維護性,降低使用的風險。
不過,builder模式也有顯著的缺點,最明顯的就是每次建立物件的時候都要額外的建立乙個builder物件,這個對於注重效能的系統是乙個問題。另外,builder模式從形式上也要比一般的建構函式複雜。所以joshua建議除非建構函式的引數很多,而且大部分都是可選的,否則首先還是不要考慮builder模式。
Effective Java 讀書筆記
第二章 建立與銷毀物件 1 考慮用靜態工廠方法代替構造器 優點 1 有名稱 2 不必在每次呼叫他們的時候都建立乙個新的物件 3 他們可以返回原返回型別的任何子型別物件 4 使 更簡潔 缺點 1 類如果不含公有的或者受保護的構造器,就不能被子類化 2 與其他的靜態方法實際上沒有任何區別,不能一眼就看出...
Effective java 讀書筆記
一本書看了不少時間,終於這兩天看完了,看的眼睛生疼,估計也就領略了全書1 5的精華。這本書確確實實是本好書,就像剛剛牙牙學語的孩子必須接受父母的教導,電源插頭不可以摸,熱水不可以直接喝等等,很多經驗之談,給人確確實實的思考和應用。盡量多的編碼。如同讀書一樣,沒有一定的 量的積累,很難成為乙個好的程式...
Effective Java 讀書筆記 4
23,在新 裡不用使用raw type。用了泛型之後,可以提供編譯時型別檢查,便於及早發現錯誤,從集合裡讀取資料的時候也不用手動的cast。如果真的想向集合裡插入多種型別的資料,可以使用object作為引數型別,比如list這樣的。有點要注意的是class literal不能是泛型,只能有list....