遇到多个构造器参数时,要考虑用构建器。
写一个类,一般都会写它的构造函数,如果成员变量,有很多个,就带来了一个后果,就是构造函数,所带参数很长,可读性很差,同时需要重载多个构造函数,不方便,甚至在使用构造函数初始化一个类型,写错或者漏写参数,会给程序带来意想不到的后果。
诚然,我们可以使用javabean的方式来解决参数比较多的问题,这样会引进另一个问题:这样的类,线程不安全。当有多个线程对这个对象进行操作,使用set方法会造成对象状态的不统一,引入一个更大的问题。那么问题来了,能不能,当有多个参数时,初始化一个对象,兼顾安全性和可读性。Builder模式是个不错的选择。
书中的例子:
public class NutritionFacts {
private final int servingSize;
private final int serving;
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 serving;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate= 0;
public Builder(int servingSize, int serving) {
this.servingSize = servingSize;
this.serving = serving;
}
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 NutritingFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts (Builder builder) {
servingSize = builder.servingSize;
serving = builder.serving;
fat = builder.fat;
calories = builder.calories;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
创建一个NutritionFacts对象时,尽管参数有很多,可以采用 NutritionFacts.Builder(240,8).calories(10).fat(20).sodium(34).carbohydrate(40).build()。
这样可读性达到了,而且使用起来十分灵活,也考虑到了安全性。