Effective2. 遇到多个构造器参数时要考虑使用构建器
2020-06-22 本文已影响0人
小蜜蜂_Jade
why?
当创建实例时,构造器包含多个必选参数,则创建时必须对多个参数赋值。
解决方案
- 以往解决方案一般是重叠构造器模式。但容易代码量过多,不简洁。
- JavaBeans模式:先调用一个无参构造器来创建对象,然后再调用setter方法来设置每个必要的参数,以及每个相关的可选参数。
弊端:在构造过程,JavaBean可能处在不一致的状态;把类做成不可变的可能性不复存在。 - 建造者(Builder)模式:不直接生成想要的对象,而是让客户端利用必要的参数调用构造器(或静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的build方法来生成通常是不可变的对象。这个builder通常是它构建的类的静态成员类。
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(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
/**
* builder的设值方法返回builder本身,以便把调用链接起来,得到一个流式的API.
*/
public static class Builder {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 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 sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
}
未完待看...