정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다!

public class NutritionFacts {

		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 NutritionFacts(final int servingSize, final int servings) {
		this(servingSize, servings, 0);
}

public NutritionFacts(final int servingSize, final int servings, final int calories) {
		this(servingSize, servings, calories, 0);
}

public NutritionFacts(final int servingSize, final int servings, final int calories,
											final int fat) {
		this(servingSize, servings, calories, fat, 0);
}

public NutritionFacts(final int servingSize, final int servings, final int calories,
											final int fat, final int sodium) {
		this(servingSize, servings, calories, fat, sodium, 0);
}

public NutritionFacts(final int servingSize, final int servings, final int calories,
											final int fat, final int sodium, final int carbohydrate) {
		this.servingSize = servingSize;
		this.servings = servings;
		this.calories = calories;
		this.fat = fat;
		this.sodium = sodium;
		this.carbohydrate = carbohydrate;
}

이러한 생성자들은 사용자가 설정하길 원치 않는 매개변수까지 포함하기 쉽다!

점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.

두 번째 대안으로는 자바빈즈 패턴(JavaBeans Pattern)이 있다.

public class NutritionFacts {
		
		// 매개변수들은 기본값이 있다면 기본값으로 초기화된다.
		private int servingSize = -1;  // 필수, 기본값 없음
		private int servings = -1;     // 필수, 기본값 없음
		private int calories = 0;
		private int fat = 0;
		private int sodium = 0;
		private int carbohydrate = 0;

		public NutritionFacts() {}

		// Setter Method
		public void setServingSize(final int val) { servingSize = val; }
		public void setServings(final int val) { servings = val; }
		public void setCalories(final int val) { calories = val; }
		public void setFat(final int val) { fat = val; }
		public void setSodium(final int val) { sodium = val; }
		public void setCarbohydrate(final int val) { carbohydrate = val; }
}
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);