[이펙티브 자바] 생성자에 매개변수가 많다면 빌더 패턴을 고려할 것

Dev. 로티·2022년 1월 15일
0

자바

목록 보기
2/9
post-thumbnail

많은 프로그래머들은 생성자 매개변수가 많을 때 적절하게 대응하기 위해 점층적 생성자 패턴을 주로 사용했었습니다.

ex) 점층적 생성자 패턴 예시

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 carbohyudrate;

    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 carbohyudrate) {
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        this.sodium = sodium;
        this.carbohyudrate = carbohyudrate;
    }
}

위 점층적 생성자 패턴은 매개변수의 개수가 많아지면 많아질 수록 클라이언트측 코드가 모호해지고
가독성이 떨어지는 문제가 있습니다.
(각 번째수 매개변수가 무엇을 의미하는지 정확하게 알고 사용해야함, 그렇기에 사용하기 까다로움)


위 점층적 생성자 패턴의 단점을 보완하고자 자바 빈즈 패턴이라는 것을 고려할 수 있는데

ex) 자바 빈즈 패턴

NutritionFacts nutritionFacts = new NutritionFacts();
nutritionFacts.setFat(0);
nutritionFacts.setCalories(0);
nutritionFacts.setServingSize(0);

자바 빈즈 패턴을 사용함으로써 인스턴스를 생성하기 좀 더 쉬워졌고, 가독성이 좋아지긴 했으나,
완전한 인스턴스 생성을 위해 여러개의 메소드를 거쳐야만 했고(불변성을 유지할 수 없음), 인스턴스가 완전히 생성되기 전까지는 일관성이 무너진 상태로 존재해야하는 단점을 갖고 있습니다.


이러한 점층적 생성자 패턴과 자바 빈즈 패턴의 단점을 보완하고자 빌더(Builder) 패턴이라는 것을 사용할 수 있습니다.

NutritionFacts nutritionFacts = NutritionFacts.builder()
                                              .carbohyudrate(1)
                                              .fat(2)
                                              .calories(3)
                                              .servings(2)
                                              .build();

빌더 패턴을 통해 클라이언트 코드의 가독성이 좋아지고, 자바 빈즈 패턴보다 훨씬 안전하게 인스턴스를 생성할 수 있습니다.

0개의 댓글