다음과 같은 영양정보를 표현하는 클래스를 생각해보자.
public class NutritionFacts {
private final int servingSize; // (mL, 1회 제공량) 필수
private final int servings; // (회, 총 n회 제공량) 필수
private final int calories; // (1회 제공량당) 선택
private final int fat; // (g/1회 제공량) 선택
private final int sodium; // (mg/1회 제공량) 선택
private final int carbohydrate; // (g/1회 제공량) 선택
...
}
// servingSize, servings 두 항목은 필수 값이므로 반드시 필요하다.
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, servings, calories, fat, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
// 원하는 매개변수 만을 포함한 생성자가 없다면
// 4번째 매개변수 처럼 원하지 않는 값을(0) 넘겨 주어야 한다.
NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);
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 void setServingSize(int servingSize) {
this.servingSize = servingSize;
}
public void setServings(int servings) {
this.servings = servings;
}
public void setCalories(int calories) {
this.calories = calories;
}
public void setFat(int fat) {
this.fat = fat;
}
public void setSodium(int sodium) {
this.sodium = sodium;
}
public void setCarbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
}
}
// 기본 생성자로 인스턴스 생성
NutritionFacts cocaCola = new NutritionFacts();
// 원하는 매개변수 값을 설정
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
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 static class Builder {
// 필수 매개변수
private final int servingSize;
private final int servings;
// 선택 매개변수 - 기본값으로 초기화한다.
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private 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 sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
// build() 메소드를 통해서 NutritionFacts 객체를 생성한다.
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
// 외부에서는 생성자를 호출하지 못하도록 private
// 빌더가 사용하는 모든 매개변수를 가진 생성자
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
NutritionFacts cocaCola =
new NutritionFacts.Builder(10, 10) // 내부 빌더 객체 생성자
.calories(100) // 원하는 값만 설정
.sodium(35)
.build(); // 내부 빌더 객체의 메소드