[Effective Java 3/e] 아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라
아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라
점층적 생성자 패턴 - 확장하기 어렵다
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
}
}
자바빈즈 패턴 - 일관성이 깨지고, 불변으로 만들 수 없다
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setFat(35);
빌더 패턴 - 점층적 생성자 패턴과 자바빈즈 패턴의 장점만 취한다
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
public static class Builder {
// 필수 매개변수
private final int servingSize;
private final int servings;
// 선택 매개변수 - 기본값으로 초기화한다.
private int calories = 0;
private int fat = 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 NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
}
}
// 빌더 패턴 사용
NutritionFacts cocaCola = new NutritionFacts
.Builder(240, 8) // 필수값 입력
.calories(100)
.fat(35)
.build();
아이템 2 - 정리
- 매개변수가 많다면 빌더 패턴을 선택하는게 더 낫다