实例化对象时,构造器的自变量有时候会不定,即有有多个可选参数时,可重载构造器,但是有时候在问题模型中,某种类型的构造器是后期出现的,随着情况的不同,可能会添加多个构造器,这时候,代码很难维护。同时,客户端调用时,不便于阅读和使用(重载太多)
替代方案一:JavaBean模式
调用无参数构造函数,然后通过setter方法设置必要的参数。但是可能的缺点:由可能存在的JavaBean状态不一致导致的线程安全问题。
替代方案二:Builder模式
实例代码
package com.xl.chap1;
public class BuilderMain {
// 必须的字段
private final int servingSize;
private final int servings;
// 可选字段
private int calories = 0;
private int fat = 0;
private int carbohyrate = 0;
private int sodium = 0;
public BuilderMain(Builder builder) {
// 运行期初始化常量
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.calories = builder.calories;
this.fat = builder.fat;
this.carbohyrate = builder.carbohyrate;
this.sodium = builder.sodium;
}
public static class Builder {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int carbohyrate = 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 carbohydrate(int val) {
carbohyrate = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public BuilderMain build() {
return new BuilderMain(this);
}
}
public static void main(String[] args) {
BuilderMain bm = new BuilderMain.Builder(240, 8).calories(100)
.sodium(35).carbohydrate(27).build();
}
}
当构造器参数可选时,可考虑采用Builder模式来处理。