读《effective java》笔记一:遇到多个构造器参数时要考虑用构造器

来源:互联网 发布:java erp 开源框架 编辑:程序博客网 时间:2024/05/18 02:23
  第二条  遇到多个构造器参数时要考虑用构造器

这里考虑的是参数多的情况,如果参数个数比较少,那直接采用一般的构造方法就可以了。
   书中介绍了写构造方法的时候几种方式:
    1. 重叠构造方法模式:
       缺点:有许多参数的时候,客户端代码会很难写,而且较难以阅读。

     2. javaBeans模式:
       缺点:  
            在构造过程中JavaBean可能处于不一致的状态,类本身无法判断是否有效性。
            类做成不可变的可能。

     3. builder模式:
       优点:
            在build方法生成对象的时候,可以做检查,判断是否符合要求
            参数灵活
       缺点:
            创建对象必须先创建构造器,如果对性能要求非常高的应用少用为妙



具体实现代码:

1.重叠构造方法模式:

public class NutritionFacts {    private final int servingSize;        private final int serviings;        private final int calories;        private final int fat;        private int sodium;        private int carbohydrate;        public NutritionFacts(int servingSize, int serviings){        this(servingSize, serviings, 0);    }        public NutritionFacts(int servingSize, int serviings, int calories){        this(servingSize, serviings, calories, 0);    }        public NutritionFacts(int servingSize, int serviings, int calories, int fat){        this(servingSize, serviings, calories, fat,0);    }        public NutritionFacts(int servingSize, int serviings, int calories, int fat, int sodium){        this(servingSize, serviings, calories, fat, sodium,0);    }        public NutritionFacts(int servingSize, int serviings, int calories, int fat, int sodium, int carbohydrate){        this.servingSize = servingSize;        this.serviings = serviings;        this.calories = calories;        this.fat = fat;        this.sodium = sodium;        this.carbohydrate = carbohydrate;    }}

2. javaBeans模式:

public class NutritionFacts {    private  int servingSize;        private  int serviings;        private  int calories;        private  int fat;        private int sodium;        private int carbohydrate;        public NutritionFacts(){}            public void setServingSize(int servingSize) {        this.servingSize = servingSize;    }    public void setServiings(int serviings) {        this.serviings = serviings;    }    public void setCalories(int calories) {        this.calories = calories;    }    public void setFat(int fat) {        this.fat = fat;    }    public void setSodium(int sodium) {        this.sodium = sodium;    }    public void setCarbohydrate(int carbohydrate) {        this.carbohydrate = carbohydrate;    }

3. builder模式

public class NutritionFacts {    private final int servingSize;    private final int serviings;    private final int calories;    private final int fat;    private final int sodium;    private final int carbohydrate;    public static class Builder {        private final int servingSize;        private final int serviings;        // 可以为空        private int calories = 0;        private int fat = 0;        private int sodium = 0;        private int carbohydrate = 0;        public Builder(int servingSize, int serviings) {            this.servingSize = servingSize;            this.serviings = serviings;        }                public Builder calories(int val){            calories = val;            return this;        }                public Builder fat(int val){            fat = val;            return this;        }                public Builder sodium(int val){            sodium = val;            return this;        }                public Builder carbohydrate(int val){            carbohydrate = val;            return this;        }                public NutritionFacts build(){            return new NutritionFacts(this);        }            }    public NutritionFacts(Builder builder) {        servingSize = builder.servingSize;        serviings = builder.serviings;        calories = builder.calories;        fat = builder.fat;        sodium = builder.sodium;        carbohydrate = builder.carbohydrate;    }}

这个调用的时候:
NutritionFacts cocaCola = new NutritionFacts.Builder(11,22).calories(1).fat(2).calories(3).build();

原创粉丝点击