亡羊补牢,未为迟也。
- 当我们遇到参数较多的构造器时,可考虑Builder模式。将众多参数分为必要参数和可选参数,如此既解决了构建对象时必须填写可选参数的问题,同时使得程序更具可读性。
当然,你说可以重载构造器,提供多种构造方法,但当其他人想创建对象时,可能会一脸懵,我应该用哪个?
我们用的更多的是JavaBean模式,调用无参构造器创建对象,然后setter属性值,这种方式构建简单且易读,但将对象的构建拆分成为不同的过程中,可能会导致线程安全性问题。
因此有了该条建议:使用Builder模式。 下边是Builder模式构建对象的一个例子:
public class NutritionFacts {
// 用final修饰,保证只在初始化时赋值
private final int size;
private final int fat;
private final int sodium;
private final int calories;
// 用private修饰构造器,只允许外部使用Builder来创建对象
private NutritionFacts(Builder builder) {
this.size = builder.size;
this.fat = builder.fat;
this.sodium = builder.sodium;
this.calories = builder.calories;
}
public static class Builder {
// Required parameters
private final int size;
private final int fat;
// Optional parameters - initialized to default values
private int sodium = 0;
private int calories = 0;
// 可选参数,返回Builder本身,从而将调用链接起来。
public Builder setSodium(int sodium) {
this.sodium = sodium;
return this;
}
public Builder setCalories(int calories) {
this.calories = calories;
return this;
}
// 必要参数
public Builder(int size, int fat) {
this.size = size;
this.fat = fat;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
}
客户端构建调用:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).setSodium(20).builder();