2023. 1. 5. 09:30γJAVA/Effective JAVA
μμ΄ν 2. μμ±μμ λ§€κ°λ³μκ° λ§λ€λ©΄ λΉλλ₯Ό κ³ λ €νλΌ.
[μ΄νν°λΈ μλ°] Item2. μμ±μμ λ§€κ°λ³μκ° λ§λ€λ©΄ λΉλλ₯Ό κ³ λ €νλΌ. (μ μΈ΅μ  μμ±μ ν¨ν΄, μλ°
μμ΄ν 2. μμ±μμ λ§€κ°λ³μκ° λ§λ€λ©΄ λΉλλ₯Ό κ³ λ €νλΌ. μμμ λ°°μ λ μ μ  ν©ν°λ¦¬μ μμ±μμλ μ μ½μ΄ μλλ°, μ νμ  λ§€κ°λ³μκ° λ§μ κ²½μ°μ μ μ νκ² λμνκΈ° μ΄λ ΅λ€λ μ μ΄λ€. μλ₯Ό λ€
hyejin.tistory.com
μμ μμ±ν λ΄μ©μμλ μμ±μμ λ§€κ°λ³μκ° λ§λ€λ©΄ κ³ λ €ν μ μλ λ°©μμΌλ‘ μ μΈ΅μ  μμ±μ ν¨ν΄κ³Ό μλ°λΉμ¦ ν¨ν΄μ λν΄μ μ€λͺ νλ€.
κ·Όλ° μ΄ λκ°μ λμμλ κ°κ°μ λ¨μ μ΄ μμλλ°..
λ¨Όμ  μ μΈ΅μ  μμ±μ ν¨ν΄μ μ°μ λ§€κ°λ³μκ° λμ΄λλ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μμ±νκ±°λ μ½κ³ νμ νκΈ° λ²κ±°λ‘λ€λ λ¨μ μ΄ μλ€.
μλ° λΉμ¦ ν¨ν΄μ μμ ν κ°μ²΄λ₯Ό μμ±νκΈ° μν΄μλ λ©μλλ₯Ό μ¬λ¬λ² νΈμΆν΄μΌνκ³ , μμ ν κ°μ²΄λ₯Ό μμ±νκΈ° μ κΉμ§λ μΌκ΄μ±μ΄ 무λμ§ μνκ° λ μ μλ€λ λ¨μ μ΄ μλ€.
λμ1κ³Ό λμ2κ° λͺ¨λ λ¨μ ?μ΄ μ‘΄μ¬νλλ°.. 3λ²μ§Έ λμμΌλ‘ λΉλν¨ν΄μ κΆμ₯νλ€.
λμ3. λΉλ ν¨ν΄ Builder Pattern
λΉλ ν¨ν΄μ μμμμ μ μΈ΅μ  μμ±μ ν¨ν΄μ μ₯μ μ΄λ μμ μ±κ³Ό μλ°λΉμ¦ ν¨ν΄μ κ°λ μ±μ κ²ΈλΉν ν¨ν΄μ΄λ€.
λΉλν¨ν΄μ ν΄λΌμ΄μΈνΈλ νμν κ°μ²΄λ₯Ό μ§μ  λ§λλ λμ , νμ λ§€κ°λ³μλ§μΌλ‘ μμ±μλ₯Ό νΈμΆν΄ λΉλ κ°μ²΄λ₯Ό μ»λλ€.
κ·Έλ° λ€μ λΉλ κ°μ²΄κ° μ 곡νλ μΌμ’ μ μΈν° λ©μλλ€λ‘ μνλ μ ν λ§€κ°λ³μλ€μ μ€μ νλ€.
κ·Έλ¦¬κ³ λ§€κ°λ³μκ° μλ build λ©μλλ₯Ό νΈμΆν΄μ λΆλ³ κ°μ²΄λ₯Ό μ»μ μ μλ€.
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ν μ κ³΅λ)        μ ν
    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;
    }
}
μ΄ ν΄λμ€λ λΆλ³ ν΄λμ€λ‘, λͺ¨λ λ§€κ°λ³μμ κΈ°λ³Έκ°λ€μ ν κ³³μ λͺ¨μ λκ³ , λΉλμ μΈν° λ©μλλ€μ λΉλ μμ μ λ°ννκΈ° λλ¬Έμ μ°μμ μΌλ‘ νΈμΆν μ μλ€.
-> μ΄λ° λ°©μμ ν루μΈνΈ API(fluent API) νΉμ λ©μλ μ°μ(method chaining) μ΄λΌκ³ νλ€.
