2. 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라

hany·2022년 11월 28일
0

effective-java

목록 보기
2/4

정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안

대안1: 점층적 생성자 패턴 또는 생성자 체이닝

  • 매개변수가 늘어나면 클라이언트 코드를 작성하거나 읽기 어렵다.
  • 필수적인 변수는 생성자에 매개변수로 넘겨주는 것이 좋다.
  • 리팩토링 가능하다.

점층적 생성자 패턴

  • AS-IS
    리팩토링 대상
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;
    }
  • TO-BE
    매개변수 적은 쪽에서 많은 쪽으로 this로 선언을 해준다.
    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;
    }

대안2: 자바 빈즈 패턴

  • 파라미터가 많은 경우 사용하면 좋은 리팩토링 기법
    Setter는 불완전하다.
    클래스를 불변으로 만들 수 없다.
    완전한 객체를 만들려면 메서드를 여러번 호출해야 한다. (일관성이 무너진 상 태가 될 수도 있다.)
  • AS-IS
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;
    }
}
  • TO-BE
public class NutritionFacts {
        NutritionFacts cocaCola = new Builder(240, 8) // 필수적인 것
                .calories(100) // 필수적이지 않은 것
                .sodium(35) // 필수적이지 않은 것
                .carbohydrate(27).build();

권장방법: 빌더 패턴

  • 장점: 필수값을 강제할 수 있어 안전하다.
    생성자 + 자바빈즈 장점을 각각 취할 수 있다.
  • 단점: 코드가 어렵다. 모든 경우에 빌더를 만들지 말 것.
  • 언제 사용:
    immutable 하게 만들고 싶을 때
    필수, 불필수적인 변수가 각각 나누어져 있을 때

@Builder는 어떻게 동작할 수 있는 것일까? annotation processor
: compile 시점에 읽어드려 코드를 조작한다.

  • p15, 자바빈즈, 게터, 세터
  • p17, 객체 얼리기 (freezing)
  • p17, 빌더 패턴
  • p19, IllegalArgumentException
  • P21, 가변인수 (varargs) 매개변수를 여러 개 사용할 수 있다.

완벽 공략 6. 자바빈(JavaBean)이란?

profile
number1hany

0개의 댓글

관련 채용 정보