<Effective Java> RULE 2. 생성자 인자가 많을 때는 Builder패턴 적용을 고려하라
선택적 인자가 많은 상황에서 정적팩토리나 생성자는 적합하지 않다.
인자가 20개가 넘은 상황에서는 무슨 패턴을 사용해야 할까?
인자가 많을 시 주로 사용하는 패턴
1) 점층적 생성자 패턴
2) 자바빈 패턴
3) 빌더 패턴
1) 점층적 생성자 패턴 - 많은 인자 개수에 적합하지 못하다.
점층적 생성자 패턴을 잘 동작하지만 인자 수가 늘어나면 클라이언트 코드를 작성하기가 어려워지고, 무엇보다 읽기 어려운 코드가 되고 만다.
2) 자바빈 패턴 - 일관성 훼손이 가능하고, 항상 변경 가능하다.
1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체 일관성이 일시적으로 깨질 수 있다는 것이다.
또한 객체를 수정하는 설정자가 있으므로 자바빈 패턴으로는 객체를 수정할 수없는 클래스인 변경 불가능(immutable) 클래스를 만들 수 없다.
3) 빌더 패턴 - 필요한 객체를 직접 생성하는 대신, 클라이언트는 먼저 필수 인자들을 생성자에 전부 전달하여 빌더 객체(builder object)를 만든다.
빌터패턴의 장점 :
빌더 객체는 여러개 varArgs 인자를 받을 수 있다.
(설정 메서드마다 하나씩 필요한 만큼 varArgs인자를 사용 가능)
유연성, 하나의 빌더 객체로 여러 객체를 만들 수 있다
(다른 객체를 생성해야 할 때마다 빌더 객체의 설정 메서드를 호출하면 다음 생성될 객체를 바꿀 수 있다)
빌터패턴의 단점 :
객체를 생성하려면 우선 빌더 객체를 생성해야 한다. (성능이 중요할 때 고려사항)
점층적 생성자 패턴보다 많은 코드를 요구 (인자 4개 이상에서 사용 권장)
**JDK 1.5버전 이상일경우 제네릭 자료형을 통해 어떤 자료형의 객체를 만드는 빌더냐에 관계없이 모든 빌더에 적용할 수 있다.
//자료형이 T인 객체에 대한 빌더
public interface Builder<T> {
public T build();
}
이런 인터페이스를 통해 NutritionFacts.Builder클래스는 Builder <NutritionFacts>를 implement를 하도록 선언할 수 있으며 컴파일 시점에 예외검사가 가능해야한다는 규칙을 피할 수 있다.
빌더 패턴은 인자가 많은 생성자나 정적 팩터리가 필요한 클래스를 설계할 때, 특히 대부분의 인자가 선택적 인자인 상황에 유용하다. 클라이언트 코드 가독성은 점층적 생성자 패턴을 사용할 때 보다 좋아질 것이며 자바빈을 사용할 때보다 훨씬 안전할 것이다.