《Effective Java 第三版》讀書筆記 - Item 2:構(gòu)造函數(shù)參數(shù)過多時补疑,建議使用 Builder

重疊構(gòu)造器模式

  • 重疊構(gòu)造器模式(telescoping constructor pattern)采用前面是必選參數(shù)班利,后面是可選參數(shù)的模式
  • 由于 Java 不支持缺省參數(shù)洞豁,所以會采用多個構(gòu)造函數(shù)窗看,每個構(gòu)造函數(shù)增加一個可選參數(shù)的聲明方式
public class NutritionFacts {
    ...
    public NutritionFacts(int servingSize, int servings) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
        ...
    }
}
  • 創(chuàng)建實例時茸歧,使用一下代碼
NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);

重疊構(gòu)造器模式的缺點

  • 構(gòu)造函數(shù)聲明冗長
  • 使用時,代碼不直觀显沈,不容易理解

JavaBean 模式

  • 空構(gòu)造函數(shù)
  • 使用 set 系列方法來設(shè)置

JavaBean 模式的缺點

  • 字段的設(shè)置是隨機順序的软瞎,無法保持一個統(tǒng)一的內(nèi)部狀態(tài)
  • 無法事先不可變性質(zhì)的類,需要額外的努力來實現(xiàn)線程安全

Builder 模式 (推薦)

  • 源自設(shè)計模式的 Builder pattern拉讯,但不盡相同
  • 使用代碼
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
            .calories(100)
            .sodium(35)
            .carbohydrate(27)
            .build();
  • 在生成對象時涤浇,可統(tǒng)一檢查參數(shù)的有效性(build 方法中)
  • 支持類繼承關(guān)系和層次結(jié)構(gòu)(見原書的例子,有更詳盡的說明魔慷,如遞歸類型參數(shù))
  • 比之 JavaBean 模式只锭,更加安全
  • 但是,也更加重一些院尔,如果注重極端性能纹烹,可考慮優(yōu)化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市召边,隨后出現(xiàn)的幾起案子铺呵,更是在濱河造成了極大的恐慌,老刑警劉巖隧熙,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片挂,死亡現(xiàn)場離奇詭異,居然都是意外死亡贞盯,警方通過查閱死者的電腦和手機音念,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏敢,“玉大人闷愤,你說我怎么就攤上這事〖啵” “怎么了讥脐?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵遭居,是天一觀的道長。 經(jīng)常有香客問我旬渠,道長俱萍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任告丢,我火速辦了婚禮枪蘑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岖免。我一直安慰自己岳颇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布颅湘。 她就那樣靜靜地躺著赦役,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栅炒。 梳的紋絲不亂的頭發(fā)上掂摔,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音赢赊,去河邊找鬼乙漓。 笑死,一個胖子當(dāng)著我的面吹牛释移,可吹牛的內(nèi)容都是我干的叭披。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玩讳,長吁一口氣:“原來是場噩夢啊……” “哼涩蜘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熏纯,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤同诫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后樟澜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體误窖,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年秩贰,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹俺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡毒费,死狀恐怖丙唧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情觅玻,我是刑警寧澤想际,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布培漏,位于F島的核電站,受9級特大地震影響沼琉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桩匪,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一打瘪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傻昙,春花似錦闺骚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贾惦,卻和暖如春胸梆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背须板。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工碰镜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人习瑰。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓绪颖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甜奄。 傳聞我的和親對象是個殘疾皇子柠横,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354