본문 바로가기

공부 기록/Java

[이펙티브 자바 3/E] 아이템2 - 생성자에 매개변수가 많다면 빌더를 고려하라

<생성자에 매개변수가 많다면 빌더를 고려하라>

점층적 생성자 패턴(telescoping constructor pattern)

- 필수 매개변수만 받는 생성자 ... 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식

=> 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.

 

자바빈즈 패턴(JavaBeans pattern)

- 매개변수가 없는 생성자로 객체를 만든 후, 세터(setter)메서드를 호출해 원하는 매개변수의 값을 설정하는 방식

=> 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.


빌더 패턴(Builder pattern)

- 필수 매개변수만으로 생성자(혹은 정적 팩터리)를 호출해 빌더 객체를 얻는다. 그런 다음 빌더 객체가 제공하는 일종의 세터 메서드들로 원하는 선택 매개변수들을 설정한다. 마지막으로 매개변수가 없는 build 메서드를 호출해 우리에게 필요한 
(보통은 불변인) 객체를 얻는다.

- 빌더의 세터 메서드들은 빌더 자신을 반환하기 때문에 연쇄적으로 호출할 수 있다. => 메서드 호출이 흐르듯 연결된다는 뜻으로 플루언트 API(fluent API) 혹은 메서드 연쇄(method chaining)이라 한다.

- 빌더 패턴은 (파이썬과 스칼라에 있는) 명명된 선택적 매개변수(named optional parameters)를 흉내낸 것이다.

- 빌더 패턴은 계층적으로 설계된 클래스와 함께 쓰기에 좋다.

- 공변 반환 타이핑(covariant return typing) : 하위 클래스의 메서드가 상위 클래스의 메서드가 정의한 반환 타입이 아닌, 그 하위 타입을 반환하는 기능 => 클라이언트가 형변환에 신경쓰지 않고도 빌더를 사용할 수 있다.


[핵심 정리]

- 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다.

- 빌더는 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고, 자바빈즈보다 훨씬 안전하다.


[용어 정리]

불변(immutable 혹은 immutability) : 어떠한 변경도 허용하지 않는다. 대표적으로 String 객체가 있다.

불변식(invariant) : 프로그램이 실행되는 동안, 혹은 정해진 기간 동안 반드시 만족해야 하는 조건 => 변경을 허용할 수는 있으나 주어진 조건 내에서만 허용한다.

=> 가변 객체에도 불변식은 존재할 수 있으며, 넓게 보면 불변은 불변식의 극단적인 예라 할 수 있다.