2.コンストラクタのパラメータが多い場合は、コンストラクタを考慮します.


出典:機能Java(第2版)
静的工場法とジェネレータには共通の制限がある.すなわち、選択可能なパラメータが多くなると、弾性処理ができなくなる.
これまでTelescoppingコンストラクタモードが用いられてきた.必要なパラメータのみを持つコンストラクション関数などの形式で、コンストラクション関数を重ねます.パラメータが多い場合は書きにくく、読みやすさが悪い.
2つ目はJavaBeansモードです.パラメータなしのジェネレータを呼び出し、setterメソッドを呼び出して各必須フィールド値を指定します.
ただし、JavaBeansモードは複数のメソッド呼び出しに分かれているため、作成中にJavaBeansオブジェクトが一貫性を保つことができない場合があります.
3つ目の方法は、コンストラクタモードで必要なオブジェクトを直接作成するのではなく、すべての必須パラメータを持つジェネレータを呼び出すことによってコンストラクタオブジェクトを取得することです.
コンストラクタは、作成したオブジェクトのクラスに含まれる静的メンバークラスです.
public class NutirtionFacts {
	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 static class Builder {
    	//필수
        private final int servingSize;
    	private final int servings;
        
        //선택 - 디폴트 값으로 초기화
        private final int calories = 0;
        private final int fat = 0;
        private final int sodium = 0;
        private final 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 carbohydrate(int val) {
        	carbohydrate = val;
            return this;
        }
        
        public Builder sodium(int val) {
        	sodium = val;
            return this;
        }
        
        public NutritionFacts build() {
        	return new NutritionFacts(this);
        }
        
        private NutritionFacts(Builder builder) {
        	this.servingSize = builder.servingSize;
            this.servings = builder.servings;
            this.calories = builder.calories;
            this.fat = builder.fat;
            this.carbohydrate = builder.carbohydrate;
            this.sodium = builder.sodium;
        }
        
    }
}


NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                          .calories(100)
                          .sodium(35)
                          .carbohydrate(27)
                          .builder();
このクライアントコードの作成は容易で、可読性が良い.
  • ビルダーは、自分のパラメータに不変規則(不変量)を適用することができ、構築方法はこれらの不変規則をチェックすることができる.
  • 以上の可変パラメータがあり得る.