2. 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자.

swucs·2022년 2월 12일
0

이펙티브 자바

목록 보기
2/2

출처 : 이펙티브 자바 (제2판)

static 팩토리 메소드와 생성자는 공통적인 제약이 있다. 선택 가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다는 것이다.

지금까지는 텔리스코핑 생성자(telescoping consturctor)패턴을 사용했다. 필수 매개변수만 가지는 생성자 등의 형태로 생성자를 겹겹이 만드는 것이다. 매개변수가 많은 경우는 작성이 힘들고 가독성이 떨어진다.

두번째는 자바빈즈(JavaBeans) 패턴이 있다. 매개변수가 없는 생성자를 호출하고 setter 메소드를 호출하여 각각의 필수 필드 값을 지정한다.

그러나 자바빈즈 패턴은 여러번의 메소드 호출로 나누어지므로 생성 과정을 거치는 동안 자바빈 객체가 일관된 상태를 유지하지 못할 수 있다.

세번째 방법은 빌더(Builder)패턴의 형태로써 원하는 객체를 바로 생성하는 대신 클라이언트는 모든 필수 매개변수를 갖는 생성자를 호출하여 빌더 객체를 얻는다.

빌더는 자신이 생성하는 객체의 클래스에 포함된 static 멤버 클래스이다.

public class NutirtionFacts {
	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 final int calories = 0;
        private final int fat = 0;
        private final int sodium = 0;
        private final 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 carbohydrate(int val) {
        	carbohydrate = val;
            return this;
        }
        
        public Builder sodium(int val) {
        	sodium = val;
            return this;
        }
        
        public NutritionFacts build() {
        	return new NutritionFacts(this);
        }
        
        private NutritionFacts(Builder builder) {
        	this.servingSize = builder.servingSize;
            this.servings = builder.servings;
            this.calories = builder.calories;
            this.fat = builder.fat;
            this.carbohydrate = builder.carbohydrate;
            this.sodium = builder.sodium;
        }
        
    }
}


NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                          .calories(100)
                          .sodium(35)
                          .carbohydrate(27)
                          .builder();

이런 클라이언트코드는 작성이 쉽고 가독성이 좋다.

  • 빌더는 자신의 매개변수에 불변 규칙(invariants)을 적용할 수 있고 build 메소드는 그런 불변 규칙을 검사할 수 있다.
  • 여러 개의 가변인자 매개변수를 가질 수 있다.
profile
백엔드 개발자

0개의 댓글

관련 채용 정보