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(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = 0;
this.fat = 0;
this.sodium = 0;
this.carbohydrate = 0;
}
public NutritionFacts(int servingSize, int servings, int calories) { // 중복 코드
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = 0;
this.sodium = 0;
this.carbohydrate = 0;
}
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0); // 적용한 곳
}
public NutritionFacts(int servingSize, int servings, int calories) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = 0;
this.sodium = 0;
this.carbohydrate = 0;
}
Setter
는 불완전하다.public class NutritionFacts {
public static void main(String[] args) {
new NutritionFacts(10, 10, 10); // 어떤 parameter를 각각 넣어줘야할지 알기 어렵다.
}
public NutritionFacts(int servingSize, int servings, int calories) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = 0;
this.sodium = 0;
this.carbohydrate = 0;
}
}
public class NutritionFacts {
NutritionFacts cocaCola = new Builder(240, 8) // 필수적인 것
.calories(100) // 필수적이지 않은 것
.sodium(35) // 필수적이지 않은 것
.carbohydrate(27).build();
@Builder는 어떻게 동작할 수 있는 것일까? annotation processor
: compile 시점에 읽어드려 코드를 조작한다.