亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

子類化Java Builder類

子類化Java Builder類

白衣非少年 2019-08-30 16:10:17
給這篇Dr Dobbs文章,特別是Builder Pattern,我們如何處理子類化Builder的情況?以我們想要子類化添加GMO標簽的示例的簡化版本為例,一個簡單的實現將是:public class NutritionFacts {                                                                                                        private final int calories;                                                                                                      public static class Builder {                                                                                                        private int calories = 0;                                                                                                        public Builder() {}                                                                                                              public Builder calories(int val) { calories = val; return this; }                                                                                                                                public NutritionFacts build() { return new NutritionFacts(this); }                                                           }                                                                                                                                protected NutritionFacts(Builder builder) {                                                                                          calories = builder.calories;                                                                                                 }                                                                                                                            }現在,我們可以編寫如下代碼:GMOFacts.Builder b = new GMOFacts.Builder();b.GMO(true).calories(100);但是,如果我們得到錯誤的訂單,那一切都會失敗:GMOFacts.Builder b = new GMOFacts.Builder();b.calories(100).GMO(true);問題當然是NutritionFacts.Builder返回a NutritionFacts.Builder而不是a GMOFacts.Builder,所以我們如何解決這個問題,還是有更好的模式可以使用?
查看完整描述

3 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

您可以使用泛型來解決它。我認為這被稱為“奇怪的反復出現的通用模式”


使基類構建器方法的返回類型成為通用參數。


public class NutritionFacts {


    private final int calories;


    public static class Builder<T extends Builder<T>> {


        private int calories = 0;


        public Builder() {}


        public T calories(int val) {

            calories = val;

            return (T) this;

        }


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

    }


    protected NutritionFacts(Builder<?> builder) {

        calories = builder.calories;

    }

}

現在使用派生類構建器作為泛型參數來實例化基礎構建器。


public class GMOFacts extends NutritionFacts {


    private final boolean hasGMO;


    public static class Builder extends NutritionFacts.Builder<Builder> {


        private boolean hasGMO = false;


        public Builder() {}


        public Builder GMO(boolean val) {

            hasGMO = val;

            return this;

        }


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

    }


    protected GMOFacts(Builder builder) {

        super(builder);

        hasGMO = builder.hasGMO;

    }

}


查看完整回答
反對 回復 2019-08-30
  • 3 回答
  • 0 關注
  • 725 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號