정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다!
ex) 식품 포장의 영양정보를 표현하는 클래스
총 지방.. 트랜스지방.. 포화지방.. 등 20개가 넘는 항목이지만 대부분의 값이 0이다.
이런 경우, 프로그래머들은 점층적 생성자 패턴을 즐겨 사용했다.
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);