μλ μ½λμ²λΌ μμ±μμ μμ±μμ νλΌλ―Έν°κ° λ§μ κ²½μ°μλ μ΄λ»κ² ν΄μΌ ν κΉ?
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 fianl int carbohydrate; // (g/1ν μ 곡λ) - μ ν
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, int calories, int fat){
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = 0;
this.carbohydrate = 0;
}
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium){
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = 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;
}
}
μ΄λ° κ²½μ° ν΄λΉ λ¨μμμλ λΉλμ μ¬μ©μ κ³ λ €ν΄λ³΄λΌκ³ νκ³ μλ€. λΉλλ₯Ό μ¬μ©νκΈ°μ μμ νμ¬ μΌλ°μ μΌλ‘ μ¬μ©νκ³ μλ λ°©λ²λ€μ μμλ³΄κ³ μ λΉλλ₯Ό μ¬μ©ν΄μΌ νλμ§ μκ°ν΄λ³΄μ. μ€λͺ μμλ 1) μ μΈ΅μ μμ±μ ν¨ν΄(telescoping constructor pattern), 2) μλ°λΉμ¦(JavaBeans pattern), 3) λΉλ ν¨ν΄(Builder pattern)μΌλ‘ μ§νλλ€.
1. μ μΈ΅μ μμ±μ ν¨ν΄(telescoping constructor pattern)
μ΄ λ°©μμ νμ λ§€κ° λ³μλ§ λ°λ μμ±μ, νμ 맀κ°λ³μμ μ ν 맀κ°λ³μ 1κ°λ₯Ό λ°λ μμ±μ, μ ν 맀κ°λ³μλ₯Ό 2κ° λ°λ μμ±μ,... , ννλ‘ μ ν 맀κ°λ³μλ₯Ό μ λΆ λ€ λ°λ μμ±μκΉμ§ λλ €κ°λ λ°©μμ΄λ€.
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 fianl int carbohydrate; // (g/1ν μ 곡λ) - μ ν
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, servings, calories, fat, sodium, carbohydrate);
}
}
μ΄ λ°©λ²μ λ¬Έμ μ μ μΈμ€ν΄μ€λ₯Ό λ§λ€ λ μ΄λ€ νλΌλ―Έν°λ₯Ό μ€μΌ νλμ§ μκΈ° μ΄λ ΅λ€λ κ²μ΄λ€. μλ₯Ό λ€μ΄, 첫 λ²μ§Έ νλΌλ―Έν°, λ λ²μ§Έ νλΌλ―Έν°, μΈ λ²μ§Έ νλΌλ―Έν°,..., n λ²μ§Έ νλΌλ―Έν°μ κ°κ° 무μμ μ€μΌ νλμ§ μκΈ° μ΄λ ΅λ€λ κ²μ΄λ€.
2. μλ°λΉμ¦ ν¨ν΄(JavaBeans pattern)
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 fianl int carbohydrate; // (g/1ν μ 곡λ) - μ ν
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;
}
}
μ΄ λ°©λ²μ μ₯μ μ μλμ κ°μ΄ κ°μ²΄ μμ±μ΄ κ°λ¨ν΄μ§λ€. νμ§λ§ νμ κ°λ€(servingSize, servings)μ΄ μ€μ μ΄ λμ§ μμ μνλ‘ κ·Έλ₯ μ¬μ©λ μ μλ€λ λ¨μ μ΄ μλ€. μ¦, λΆμμ ν μν(μΌκ΄μ±(consistency)μ΄ λ¬΄λμ§ μν)λ‘ μ¬μ©λ μ¬μ§κ° μλ€λ λ¬Έμ κ° μλ€.
public static void main(String[] args){
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
// cocaCola.setServings(100); // νμ κ°(servings)μ μ€μ νμ§ μμ μν
cocaCola.setCalories(100);
}
λν, μλ°λΉμ¦ ν¨ν΄μ μ¬μ©νλ©΄ μ΄λκΉμ§κ° νμ κ°μΈμ§ μ μκ° μλ€. μμ μ½λμ²λΌ servingSizeκΉμ§ μ€μ μ νλ©΄ νμ κ°μ λͺ¨λ μ€μ ν κ²μΈμ§, μλλ©΄ servingSizeμ servingsλ₯Ό λͺ¨λ μ€μ ν΄μΌ νμ κ°λ€μ λͺ¨λ μ€μ ν κ²μΈμ§ μ μκ° μλ€.
3. λΉλ ν¨ν΄(Builder pattern)
λ§μ§λ§ λμμ΄ λ°λ‘ λΉλ ν¨ν΄μ΄λ€. μ΄λ μ μΈ΅μ μμ±μ ν¨ν΄μ μμ μ±κ³Ό μλ°λΉμ¦ ν¨ν΄μ κ°λ μ±μ κ²ΈλΉν κ²μ΄λ€.
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;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
public static main(String[] args){
NutritionFacts cocaCola = new Builder(240, 8).caloreis(100).sodium(35).build();
}
κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ λ€μκ³Ό κ°λ€.
- νμ λ§€κ° λ³μλ§μΌλ‘ μμ±μ(νΉμ μ μ ν©ν°λ¦¬)λ₯Ό νΈμΆν΄ λΉλ κ°μ²΄λ₯Ό μ»λλ€.
- λΉλ κ°μ²΄κ° μ 곡νλ μΌμ’ μ μΈν° λ©μλ(μΈν°λ μλ)λ€λ‘ μνλ μ ν 맀κ°λ³μλ€μ μ€μ νλ€.
- 맀κ°λ³μκ° μλ build λ©μλλ₯Ό νΈμΆν΄ μ°λ¦¬μκ² νμν κ°μ²΄λ₯Ό μ»λλ€.
μΌμ’ μ μΈν° λ©μλλ€μ μ¬μ©ν¨μΌλ‘μ¨ ν루μΈνΈ API(fluent API) νΉμ λ©μλ μ°μ(method chaining)λ₯Ό μ¬μ©ν μ μλ€.
μ΄μμΌλ‘ μμ±μμ 맀κ°λ³μκ° λ무 λ§μ κ²½μ°μ μ¬μ©ν μ μλ 1) μ μΈ΅μ μμ±μ ν¨ν΄(telescoping constructor pattern), 2) μλ°λΉμ¦(JavaBeans pattern), 3) λΉλ ν¨ν΄(Builder pattern)μ μμ보μλ€. μμ λ¬Έμ μ λ€μ ν΄κ²°νλ λ°©μμΌλ‘ μ§νλμμ§λ§, κ·Έλ λ€κ³ λͺ¨λ κ²½μ°μ λΉλκ° μ μ νλ€λ κ²μ μλλ€. λΉλλ μ½λλ₯Ό μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λ€κ³ νλκ° μ€λ³΅λλ€λ λ¬Έμ κ° μλ€. (λ¬Όλ‘ Lombokμ @Builderλ₯Ό μ¬μ©νλ λ°©λ²μ΄ μκΈ΄ νμ§λ§ μ΄κ² λν λΆκ°μ μΈ λ¬Έμ λ₯Ό κ°μ§κ³ μλ€.)
λ°λΌμ 'νμμ μΈ νλμ νμμ μ΄μ§ μμ νλκ° μκ³ μ΄κ² λλ¬Έμ μμ±μκ° λ무 λ§μ΄ λμ΄λλ μν©'κ³Ό 'ν΄λμ€λ₯Ό λΆλ³μΌλ‘ λ§λ€κ³ μΆμ μν©'μμ λΉλ ν¨ν΄μ μ¬μ©μ νλ² κ³ λ €ν΄λ³΄μ!
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μκ°νκ³ μμ±ν κ²μ λλ€.