Item2:遇到多個(gè)構(gòu)造參數(shù)時(shí)要考慮用構(gòu)造器

構(gòu)造方法有個(gè)問題,就是不太好擴(kuò)展到大量的可選參數(shù)。ITEM1中提到的靜態(tài)工廠方法也有這個(gè)問題。
這個(gè)item講的就是如何選擇構(gòu)造器。

1. Telescoping constructor(重疊構(gòu)造器)

就是常見的Android的ViewGroup源碼中的那種危彩,一環(huán)套一環(huán)的,要自定義一個(gè)自定義控件就要復(fù)寫三個(gè)構(gòu)造函數(shù)泳桦。比如LinearLayout:

    public LinearLayout(Context context) {
        this(context, null);
    }

    public LinearLayout(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    
    public LinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

這種優(yōu)點(diǎn)是你可以只賦一個(gè)參數(shù)的值汤徽,缺點(diǎn)是有很多參數(shù)的話比如七八個(gè),還是得挨個(gè)寫灸撰,容易亂谒府。于是有第二種方法拼坎。

2. JavaBeans

只提供一個(gè)無參構(gòu)造函數(shù)。剩下的參數(shù)全用setter和getter來添加和獲取完疫。

NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);

缺點(diǎn)我不太理解泰鸡。書上大致是說會(huì)導(dǎo)致線程不安全。如下:

11.png

3. Builder

這個(gè)模式之前寫SimpleBottomNavigation的時(shí)候也用到過壳鹤,但沒有寫一個(gè)靜態(tài)的builder內(nèi)部類盛龄,當(dāng)時(shí)只是模仿的,覺得是很巧妙芳誓,每次設(shè)置一個(gè)屬性之后又返回類的instance余舶,可以自由追加;但并沒有體會(huì)到什么好處兆沙。Android的Dialog也有類似的Builder。
書中還是用了可樂的例子:

// Builder Pattern
public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder {
        // Required parameters
        private final int servingSize;
        private final int servings;
        // Optional parameters - initialized to default values
        private int calories = 0;
        private int fat = 0;
        private int carbohydrate = 0;
        private int sodium = 0;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }

        public Builder calories(int val) {
            calories = val;
            return this;
        }

        public Builder fat(int val) {
            fat = val;
            return this;
        }

        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }

        public Builder sodium(int val) {
            sodium = val;
            return this;
        }

        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

現(xiàn)在這樣新建一個(gè)client:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).sodium(35).carbohydrate(27).build();

這就是Builder模式莉掂。
特點(diǎn)是:

  • 等待所有的參數(shù)驗(yàn)證通過才會(huì)build()對(duì)象葛圃。線程安全。
  • 靈活加參數(shù)憎妙,易讀库正。
  • 寫起來略冗長(zhǎng),適合參數(shù)多的時(shí)候用厘唾。

另外

昨天我設(shè)想的是每天花一小時(shí)左右學(xué)習(xí)《Effective Java》內(nèi)容褥符,但是感覺時(shí)間有點(diǎn)捉襟見肘的,很多東西理解得不夠深抚垃,也沒很多時(shí)間去探究喷楣,加上本身項(xiàng)目經(jīng)驗(yàn)也不多,對(duì)Java的理解也不夠深鹤树。但是由于還有其他事情铣焊,所以目前也只能如此,不過這樣學(xué)習(xí)一遍也是有好處罕伯,比如之前都不知道LinearLayout里面那種構(gòu)造方法叫telescoping constructor曲伊;所以這樣了解一番以后遇到了也可以深入學(xué)習(xí)。以上追他。

22:15 pm
14/02/2017

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坟募,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邑狸,更是在濱河造成了極大的恐慌懈糯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单雾,死亡現(xiàn)場(chǎng)離奇詭異昂利,居然都是意外死亡届腐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜂奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犁苏,“玉大人,你說我怎么就攤上這事扩所∥辏” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵祖屏,是天一觀的道長(zhǎng)助赞。 經(jīng)常有香客問我,道長(zhǎng)袁勺,這世上最難降的妖魔是什么雹食? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮期丰,結(jié)果婚禮上群叶,老公的妹妹穿的比我還像新娘。我一直安慰自己钝荡,他們只是感情好街立,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埠通,像睡著了一般赎离。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端辱,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天梁剔,我揣著相機(jī)與錄音,去河邊找鬼舞蔽。 笑死憾朴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喷鸽。 我是一名探鬼主播众雷,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼做祝!你這毒婦竟也來了砾省?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤混槐,失蹤者是張志新(化名)和其女友劉穎编兄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體声登,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狠鸳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年揣苏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件舵。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸察,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铅祸,到底是詐尸還是另有隱情坑质,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布临梗,位于F島的核電站涡扼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盟庞。R本人自食惡果不足惜吃沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望什猖。 院中可真熱鬧票彪,春花似錦、人聲如沸卸伞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荤傲。三九已至,卻和暖如春颈渊,著一層夾襖步出監(jiān)牢的瞬間遂黍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工俊嗽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雾家,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓绍豁,卻偏偏與公主長(zhǎng)得像芯咧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竹揍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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