아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하
JAVA
·
정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안
대안1 - 점층적 생성자 패턴 또는 생성자 체이닝
- 점층적 생성자 패턴이란?
- 생성자 체이닝이란?
- this나 super를 사용해서 생성자에서 다른 생성자를 호출하는 기술
- 매개변수가 늘어나면 클라이언트 코드를 작성하거나 읽기 어렵다.
- 각 값의 의미, 매개변수 갯수 등을 알기 어렵다.
대안2 - 자바빈즈 패턴
- 완전한 객체를 만들려면 메서드를 여러번 호출해야 한다.
- 만약 setter를 누락하거나 예외가 발생한다면 일관성이 무너진 상태가 될 수도 있다
- 완전하게 쓰려면 freezing을 써야 한다. 실무에서는 거의 안쓴다.
- 클래스를 불변으로 만들 수 없다.
대안3 - 빌더 패턴 (권장 대안)
- 점층적 생성자보다 클라이언트 코드를 읽고 쓰기 간결하고, 자바빈즈보다 안전
- 플루언트 API 또는 메서드 체이닝을 한다.
- 빌더의 세터 메서드들은 빌더 자신을 반환하기 때문에 연쇄적 호출이 가능함을 의미
- 계층적으로 설계된 클래스와 함께 사용하기 좋다.
- 제네릭 타입과 self 메서드를 이용해 하위 클래스에서 형변환없이 메서드 연쇄를 지원
- 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하다.
- 자바빈즈보다 훨씬 안전하다.
- 마지막에 build() 메서드를 호출해야만 객체가 생성
- 항상 빌더 패턴을 권장하는 것은 아니다.
- 필수적 매개변수와 선택적 매개변수가 있는 상황
- 필수적 매개변수를 포함한 생성자를 만들고 선택적 매개변수는 체이닝 사용!
- 불변의 클래스를 만들고 싶은 상황
빌더 패턴 사용 팁
- 보통 빌더 패턴의 코드가 길기 때문에 빌더 애노테이션(롬복)을 사용
- AllArugsConstrucor를 가지기 때문에 필요하지 않다면 acceesLevel 을 private으로 지정해라
- 필수적 매개변수를 생성자로 제공하는 방법이 없음
출처
이펙티브 자바 3/E
이펙티브 자바 완벽 공략 1