2장. 규칙2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라.

규칙2. 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라.

보통 생성자의 인자 혹은 정적팩터리의 인자가 많을 땐 점층적 생성자 패턴(telescping constructor pattern)을 적용한다. 17p
점층적 생성자 패턴 : 필수인자만 받는 생성자를 하나 정의하고, 선택적 인자를 하나 받는 생성자를 추가하고, 거기에 두 개의 선택적 인자를 받는 생성자를 추가하는 식으로 생성자들을 쌓아 올리듯 추가하는 것. 하지만 점층적 생성자 패턴은 설정할 필요가 없는 필드에도 인자를 전달해야하는 경우가 생긴다. 즉 인자수가 늘어나면 클라이언트 코드를 작성하기 어려워지고 읽기 어려워진다.

생성자의 인자가 많을 때 사용할 수 있는 두번째 방법은 자바빈(JavaBeans) 패턴이다. 18p
자바빈 패턴: 인자없는 생성자를 호출하여 객체부터 만든 다음, 설정메서드(setter)들을 호출하여 필수 필드뿐아니라 선택적 필드값 까지 채우는 것이다. 자바빈 패턴은 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로 객체 일관성이 일시적으로 깨질 수 있다. 또한 변경 불가능(immutable)클래스를 만들 수 없다는점, 스레드 안정성을 제공하기 위해 해야할 일도 많아진다.

점층적 생성적 생성자 패턴의 안정성 , 자바빈 패턴의 가독성을 결합한 것이 바로 빌더(Builder)패턴이다.
필요한 객체를 직접 생성하는 대신 클라이언트는 먼저 필수인자들을 생성자 또는 정적 팩터리 메서드에 전부 전달하여 빌더객체(Builder object)를 만든다. 그런 다음 빌더 객체에 정의된 설정 메서드들을 호출하여 선택적 인자들을 추가 해 나간다. 그리고 마지막으로 아무런 인자 없이 build 메서드를 호출하여 변경 불가능 객체를 만든다.

빌더패턴의 장점

  1. 작성하기 쉽고, 읽기 쉽다.
  2. 인자에 불변식(invariant)을 적용할 수 있다.
  3. 여러개의 varargs 인자(가변인자)를 받을수 있다.
  4. 하나의 빌더 객체로 여러 객체를 만들 수 있어 유연하다.

빌더패턴의 단점

  1. 객체를 생성하기 위해 빌더 객체를 생성해야한다. 오버헤드의 문제가 될 소지는 적지만 성능이 중요한 상황에서는 문제가 될 수 있다.

요약하자면

대부분의 인자가 선택적 인자이거나 인자가 많은 생성자나 정적 팩터리가 필요한 클래스를 설계할 때 유용하다. 가독성은 점층적 생성자 패턴보다 향상되며 자바빈을 사용할 때 보다 안전하다.

Share