當構造器參數超過 4-5 個時,可讀性與調用方便性急劇下降。《Effective Java》推薦使用 Builder 模式。
public class NutritionFacts {
private final int param1, param2, param3, param4, param5, param6, param7;
private NutritionFacts(Builder builder) {
this.param1 = builder.param1; this.param2 = builder.param2;
this.param3 = builder.param3; this.param4 = builder.param4;
this.param5 = builder.param5; this.param6 = builder.param6;
this.param7 = builder.param7;
}
public static class Builder {
// 必填參數
private final int param1, param2;
// 可選參數,默認值 0
private int param3 = 0, param4 = 0, param5 = 0, param6 = 0, param7 = 0;
public Builder(int param1, int param2) { this.param1 = param1; this.param2 = param2; }
public Builder param3(int v) { param3 = v; return this; }
public Builder param4(int v) { param4 = v; return this; }
public Builder param5(int v) { param5 = v; return this; }
public Builder param6(int v) { param6 = v; return this; }
public Builder param7(int v) { param7 = v; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
public static void main(String[] args) {
NutritionFacts nf = new NutritionFacts.Builder(1, 2)
.param3(3).param4(4).param5(5).param6(6).param7(7)
.build();
}
}
final,線程安全。build() 中可集中校驗參數組合合法性。適用場景:領域模型構建、請求參數組裝、配置對象創建等。