Java類在多可選參數(shù)的情況,構(gòu)造器的寫(xiě)法

本篇內(nèi)容來(lái)自于個(gè)人在學(xué)習(xí)《effective java》一書(shū)時(shí)的理解咕痛,記錄下自己的學(xué)習(xí)情況

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

public class NutritionFactsConstructor {
    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 NutritionFactsConstructor(int servingSize, int servings){
        this(servingSize, servings, 0);
    }
    public NutritionFactsConstructor(int servingSize, int servings, int calories){
        this(servingSize, servings, calories, 0);
    }
    public NutritionFactsConstructor(int servingSize, int servings, int calories, int fat){
        this(servingSize, servings, calories, fat, 0);
    }
    public NutritionFactsConstructor(int servingSize, int servings, int calories, int fat, int sodium){
        this(servingSize, servings, calories, fat, sodium, 0);
    }
    public NutritionFactsConstructor(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate){
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        this.sodium = sodium;
        this.carbohydrate = carbohydrate;
    }
}

缺點(diǎn): 在使用時(shí)簿姨,當(dāng)選擇在參數(shù)列表中位置靠后的可選參數(shù)時(shí)距误,必須同時(shí)給必選參數(shù)和選擇的最后一個(gè)可選參數(shù)之間的無(wú)關(guān)參數(shù)賦值。

測(cè)試:

NutritionFactsConstructor n1 = new NutritionFactsConstructor(1, 1);
NutritionFactsConstructor n2 = new NutritionFactsConstructor(1, 2, 6);
NutritionFactsConstructor n3 = new NutritionFactsConstructor(1, 3, 0, 5);
System.out.println("n1 = " + n1 + "\nn2 = " + n2 + "\nn3 = " + n3);
------------------------------------------------------------------------------------------------
輸出:
n1 = NutritionFactsConstructor{servingSize=1, servings=1, calories=0, fat=0, sodium=0, carbohydrate=0}
n2 = NutritionFactsConstructor{servingSize=1, servings=2, calories=6, fat=0, sodium=0, carbohydrate=0}
n3 = NutritionFactsConstructor{servingSize=1, servings=3, calories=0, fat=5, sodium=0, carbohydrate=0}

2. JavaBeans

public class NutritionFactsJavaBeans {
    private int servingSize = -1;
    private int servings = -1;
    private int calories = 0;
    private int fat = 0;
    private int sodium = 0;
    private int carbohydrate = 0;

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

    @Override
    public String toString() {
        return "NutritionFactsJavaBeans{" +
                "servingSize=" + servingSize +
                ", servings=" + servings +
                ", calories=" + calories +
                ", fat=" + fat +
                ", sodium=" + sodium +
                ", carbohydrate=" + carbohydrate +
                '}';
    }

    public int getServingSize() {
        return servingSize;
    }

    public void setServingSize(int servingSize) {
        this.servingSize = servingSize;
    }

    public int getServings() {
        return servings;
    }

    public void setServings(int servings) {
        this.servings = servings;
    }

    public int getCalories() {
        return calories;
    }

    public void setCalories(int calories) {
        this.calories = calories;
    }

    public int getFat() {
        return fat;
    }

    public void setFat(int fat) {
        this.fat = fat;
    }

    public int getSodium() {
        return sodium;
    }

    public void setSodium(int sodium) {
        this.sodium = sodium;
    }

    public int getCarbohydrate() {
        return carbohydrate;
    }

    public void setCarbohydrate(int carbohydrate) {
        this.carbohydrate = carbohydrate;
    }
}

特點(diǎn):通過(guò)構(gòu)造器給必選參數(shù)賦值扁位,然后使用setter方法來(lái)給需要的可選參數(shù)賦值准潭。
缺點(diǎn):該種方法無(wú)法實(shí)現(xiàn)類的不可變性。
測(cè)試:

NutritionFactsJavaBeans n1 = new NutritionFactsJavaBeans(1, 1);
n1.setFat(1);
n1.setCarbohydrate(5);
System.out.println(n1);
------------------------------------------------------------------------------------------------
輸出:
NutritionFactsJavaBeans{servingSize=1, servings=1, calories=0, fat=1, sodium=0, carbohydrate=5}

3. 構(gòu)建器

public class NutritionFactsBuilder {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

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

    @Override
    public String toString() {
        return "NutritionFactsBuilder{" +
                "servingSize=" + servingSize +
                ", servings=" + servings +
                ", calories=" + calories +
                ", fat=" + fat +
                ", sodium=" + sodium +
                ", carbohydrate=" + carbohydrate +
                '}';
    }

    public static class Builder{
        private final int servingSize;
        private final int servings;
        private int calories;
        private int fat;
        private int sodium;
        private int carbohydrate;

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

        public Builder calories(int value){
            this.calories = value;
            return this;
        }
        public Builder fat(int value){
            this.fat = value;
            return this;
        }
        public Builder sodium(int value){
            this.sodium = value;
            return this;
        }
        public Builder carbohydrate(int value){
            this.carbohydrate = value;
            return this;
        }

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

特點(diǎn):先實(shí)例化靜態(tài)內(nèi)部類的對(duì)象域仇,設(shè)定好參數(shù)后再通過(guò)build方法調(diào)用外部類的構(gòu)造器從而返回外部類的對(duì)象刑然。在使用方法上具有非常好的可讀性。
缺點(diǎn):在非常追求性能優(yōu)化時(shí)暇务,靜態(tài)內(nèi)部類可能會(huì)影響性能泼掠。

測(cè)試:

NutritionFactsBuilder n1 = new NutritionFactsBuilder.Builder(1, 1).calories(1).carbohydrate(1).build();
NutritionFactsBuilder n2 = new NutritionFactsBuilder.Builder(2,2).fat(1).sodium(1).build();
System.out.println(n1);
System.out.println(n2);
------------------------------------------------------------------------------------------------
輸出:
NutritionFactsBuilder{servingSize=1, servings=1, calories=1, fat=0, sodium=0, carbohydrate=1}
NutritionFactsBuilder{servingSize=2, servings=2, calories=0, fat=1, sodium=1, carbohydrate=0}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怔软,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子择镇,更是在濱河造成了極大的恐慌挡逼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻豌,死亡現(xiàn)場(chǎng)離奇詭異家坎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饲梭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門乘盖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人憔涉,你說(shuō)我怎么就攤上這事订框。” “怎么了兜叨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵穿扳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我国旷,道長(zhǎng)矛物,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任跪但,我火速辦了婚禮履羞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屡久。我一直安慰自己忆首,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布被环。 她就那樣靜靜地躺著糙及,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筛欢。 梳的紋絲不亂的頭發(fā)上浸锨,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音版姑,去河邊找鬼柱搜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剥险,可吹牛的內(nèi)容都是我干的冯凹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宇姚!你這毒婦竟也來(lái)了匈庭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浑劳,失蹤者是張志新(化名)和其女友劉穎阱持,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體魔熏,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷咽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒜绽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镶骗。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躲雅,靈堂內(nèi)的尸體忽然破棺而出鼎姊,到底是詐尸還是另有隱情,我是刑警寧澤相赁,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布相寇,位于F島的核電站,受9級(jí)特大地震影響钮科,放射性物質(zhì)發(fā)生泄漏唤衫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一绵脯、第九天 我趴在偏房一處隱蔽的房頂上張望佳励。 院中可真熱鬧,春花似錦蛆挫、人聲如沸赃承。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楣导。三九已至废境,卻和暖如春畜挨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噩凹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工巴元, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驮宴。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓逮刨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子修己,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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