EffectiveJava-第2条 遇到多个构造器参数时要考虑用构建器
遇到多个构造器参数时要考虑用构建器,且看最佳实践代码
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 parametersprivate final int servingSize;private final int servings;// Optional parameters - initialized to default valuesprivate 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;//对象域抛出异常if(this.fat>this.sodium){ throw new IllegalArgumentException("The fat must be little than sodium!!");}}public static void main(String[] args){NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();System.out.println(cocaCola);}} 4、builder模式解决了上述问题
适应多参数,安全,方便编写,可维护性高。
5、builder实现
builder模式的一种实现方式:NutritionFacts类
对参数强加约束条件的方式。
6、builder模式缺点
为了创建对象,必须先创建它的构建器,开销增大。
实现冗长,比重叠构造器更冗长,只有在很多参数的时候才使用。
总结
本实现是builder模式的实现的一种方式。
如果类的构造器或者静态工厂中具有多个参数,设计时使用Builder模式是很好的选择。
Q:什么情况下不用??hibernate的domain