[Effective Java]-多參數(shù)構(gòu)造時(shí)考慮用構(gòu)建器

ps:代碼后期貼。
靜態(tài)工廠(static factory methon)和構(gòu)造器共同局限性:不能很好的擴(kuò)展到大量的可選參數(shù)五督。

一般情況下很多程序員使用重疊構(gòu)造器模式(telescoping constructor pattern)
優(yōu)點(diǎn):易于編寫藏否、易于調(diào)用,參數(shù)數(shù)量較少時(shí)適用充包。
缺點(diǎn):參數(shù)過多時(shí)容易失控副签,比如類型相同的參數(shù),不小心顛倒了其中兩個(gè)參數(shù)的位置基矮,編譯時(shí)不會報(bào)錯(cuò)淆储,而實(shí)際上運(yùn)行時(shí)就會出現(xiàn)錯(cuò)誤。

第二種方法家浇,JavaBeans模式(JavaBeans pattern)
實(shí)現(xiàn)過程:使用無參構(gòu)造器創(chuàng)建對象本砰,調(diào)用setter方法設(shè)置必要/可選參數(shù)。
優(yōu)點(diǎn):創(chuàng)建實(shí)例容易钢悲,代碼可讀性高灌具。
缺點(diǎn):
1、構(gòu)造對象的過程被分成了幾個(gè)調(diào)用導(dǎo)致JavaBean可能處于不一致的狀態(tài)譬巫。類無法通過校驗(yàn)構(gòu)造器參數(shù)的有效性來保證一致性咖楣,導(dǎo)致調(diào)試比較困難。
2芦昔、JavaBeans模式阻止了把類做成不可變的可能诱贿,會導(dǎo)致線程不安全,需要額外的控制來保持線程安全(在構(gòu)造完成前手工“凍結(jié)”對象,但這個(gè)方式很蠢而且無法編譯器無法確保程序員是否在使用之前先在對象上調(diào)用freeze方法)珠十。

第三種方法料扰,Builder模式(Builder Pattern)即建造者模式或者生成器模式,既能保證像重疊構(gòu)造器模式那樣的安全性焙蹭,又能保證像JavaBeans模式那樣的可讀性晒杈。
實(shí)現(xiàn)過程:不直接生成想要的對象,使用構(gòu)造器/靜態(tài)工廠來生成帶有必要參數(shù)的builder對象孔厉,然后在builder對象上調(diào)用類似setter的方法拯钻,設(shè)置可選參數(shù),最后調(diào)用無參的build方法來生成不可變的對象撰豺。
優(yōu)點(diǎn):
1粪般、調(diào)用會很容易,且可讀性高污桦。
2亩歹、比構(gòu)造器好的是,可以有多個(gè)可變參數(shù)凡橱。而構(gòu)造器只能有一個(gè)可變參數(shù)小作。
3、可利用單個(gè)builder構(gòu)建多個(gè)對象稼钩。builder的參數(shù)可以在創(chuàng)建對象期間進(jìn)行調(diào)整顾稀,且可自動(dòng)填充某些域(比如每次創(chuàng)建對象時(shí)自動(dòng)增添序列號)。
4变抽、可對參數(shù)強(qiáng)加約束條件。方法一:build方法中檢驗(yàn)這些約束條件氮块,在對象域中進(jìn)行檢驗(yàn)绍载,如果違反了約束條件,build方法拋出IllegalStateException滔蝉。方法二:用多個(gè)setter方法對某個(gè)約束條件必須持有的所有參數(shù)進(jìn)行檢查击儡,如果不滿足,setter方法拋出IllegalStateException蝠引。好處就是在setter中就可以檢驗(yàn)二不是等build時(shí)才發(fā)現(xiàn)錯(cuò)誤阳谍。
缺點(diǎn):
1、有額外的開銷螃概。為了創(chuàng)建對象需要先新建builder矫夯,雖然開銷比較小,但是在十分注重性能的情況下會成為問題吊洼。
2训貌、代碼冗長,因此只適合4個(gè)或者更多參數(shù)的情況。但是如果預(yù)料到將來可能有更多的參數(shù)递沪,推薦在一開始的時(shí)候就使用建造者模式豺鼻,因?yàn)榈鹊綄?shí)際出現(xiàn)多個(gè)參數(shù)時(shí)再添加,就會變得難看款慨,因?yàn)橛幸恍┡f的構(gòu)造器或者靜態(tài)工廠儒飒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檩奠,隨后出現(xiàn)的幾起案子桩了,更是在濱河造成了極大的恐慌,老刑警劉巖笆凌,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圣猎,死亡現(xiàn)場離奇詭異,居然都是意外死亡乞而,警方通過查閱死者的電腦和手機(jī)送悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爪模,“玉大人欠啤,你說我怎么就攤上這事∥莨啵” “怎么了洁段?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長共郭。 經(jīng)常有香客問我祠丝,道長,這世上最難降的妖魔是什么除嘹? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任写半,我火速辦了婚禮,結(jié)果婚禮上尉咕,老公的妹妹穿的比我還像新娘叠蝇。我一直安慰自己,他們只是感情好年缎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布悔捶。 她就那樣靜靜地躺著,像睡著了一般单芜。 火紅的嫁衣襯著肌膚如雪蜕该。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天洲鸠,我揣著相機(jī)與錄音蛇损,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淤齐,可吹牛的內(nèi)容都是我干的股囊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼更啄,長吁一口氣:“原來是場噩夢啊……” “哼稚疹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祭务,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤内狗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后义锥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柳沙,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年拌倍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赂鲤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柱恤,死狀恐怖数初,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梗顺,我是刑警寧澤泡孩,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仑鸥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏变屁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一泵琳、第九天 我趴在偏房一處隱蔽的房頂上張望摄职。 院中可真熱鬧,春花似錦谷市、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艺玲。三九已至括蝠,卻和暖如春饭聚,著一層夾襖步出監(jiān)牢的瞬間忌警,已是汗流浹背秒梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酪碘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓徙赢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親犀忱。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 測試交易策略 MetaTrader 4交易終端的策略測試器允許您測試EA在歷史數(shù)據(jù)上的表現(xiàn)阴汇。在測試交易機(jī)器人時(shí)节槐,需...
    牛在匯上飛閱讀 313評論 0 0
  • 早上打卡了搀庶。英語 今天晚上要加油了铜异。 不能早睡了哥倔。 計(jì)劃九點(diǎn)半以前處理完所有事情揍庄。 九點(diǎn)半到...
    伊家閱讀 714評論 0 0
  • 1.1. vue實(shí)例和數(shù)據(jù)綁定 1. 必不可少的一個(gè)選項(xiàng)就是el。 el 用于指定一個(gè)頁面中己存在的 DOM 元素...
    sweetBoy_9126閱讀 265評論 0 1
  • ? 在TensorFlow的使用過程中沃测,我們常常希望得到一個(gè)tensor的維度信息使用,具體的說蒂破,也就是現(xiàn)在有了一...
    ziyu123閱讀 7,745評論 0 1