条目2:当构造参数过多时(4个以上),考虑使用建造者模式创建对象

MarkdownPad Document

遇到多个构造器参数时考虑用构建器


遇到多个构造器参数时:

解决方案:

1.使用telescoping constructor,即提供多个可选参数的构造器。 它的局限性是当有很多参数时,客户端代码将会很难编写,并且很难阅读。

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 NutritionFacts(int servingSize , int servings) {
        this(servingSize, servings, 0);
    }
    public NutritionFacts(int servingSize , int servings , int calories) {
        this(servingSize, servings, calories, 0);
    }
    public NutritionFacts(int servingSize , int servings , int calories, int fat) {
        this(servingSize, servings, calories,fat,0);
    }
    public NutritionFacts(int servingSize , int servings , int calories , int fat , int sodium) {
        this(servingSize, servings, calories, fat, sodium, 0);
    }

    public NutritionFacts(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;
    }


    public static void main(String[] args) {
        NutritionFacts nutri = new NutritionFacts(12, 1, 0, 0, 12, 13);
    }

}

2.使用javabean模式。缺点是在构造过程中,可能使对象的状态不一致。它阻止了把类做成不可变的形式。调试更加困难。线程不安全。

public class NutritionFacts {
     // Parameters initialized to default values (if any)
    private int servingSize  = -1;  // Required; no default value
    private int servings     = -1;  //     "     "     "      "
    private int calories     = 0;
    private int fat          = 0;
    private int sodium       = 0;
    private int carbohydrate = 0;

    public NutritionFacts() { }

    // Setters
    public void setServingSize(int val)  { servingSize = val; }
    public void setServings(int val)     { servings = val; }
    public void setCalories(int val)     { calories = val; }
    public void setFat(int val)          { fat = val; }
    public void setSodium(int val)       { sodium = val; }
    public void setCarbohydrate(int val) { carbohydrate = val; }


    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts();
        cocaCola.setServingSize(240);
        cocaCola.setServings(8);
        cocaCola.setCalories(100);
        cocaCola.setSodium(35);
        cocaCola.setCarbohydrate(27);
    }

}

3.使用建造者模式。

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;
    }

    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
            calories(100).sodium(35).carbohydrate(27).build();
    }
}

 

posted @ 2015-05-04 14:55  克什米尔公子  阅读(351)  评论(0)    收藏  举报