[Effective Java/아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라
# 생성자에 매개변수가 많다면 빌더를 고려하라
- 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 것이 낫다.
- 매개변수 중 다수가 필수가 아니거나 같은 타입이면 빌더 패턴을 선택하는 것이 낫다.
- 빌더는 점층적 생성자보다 클라이언트를 읽고 쓰기가 훨씬 간결하다.
- 빌더는 자바빈즈보다 훨씬 안전하다.
정적 팩터리와 생성자는 "선택적 매개변수"가 많을 때 적절하게 대응하기 어렵다는 단점이 있다.
## 점층적 생성자 패턴(Telescoping Constructor Pattern)
- 필수 매개변수를 받는 생성자 1개, 그리고 선택 매개변수를 하나씩 늘려가며 생성자를 만드는 패턴
=> 단점
1. 클라이언트가 초기화하고 싶은 필드만 포함한 생성자가 없으면, 원하지 않는 필드까지 불가피하게 초기화
2. 복잡하고 읽기 어려움
## 자바빈즈 패턴(JavaBeans Pattern)
- setter를 사용하자
=> 단점
1. 객체 하나를 만들려면 메서드를 계속해서 호출해야하고,
2. 그 사이 일관성을 유지하기 어렵다. => 런타임 문제 디버깅이 하드해진다. (1회의 함수 호출로 객체 생성을 끝낼 수 없으므로...)
- 즉, setter가 가지는 모든 단점을 가지게 된다. "불변 객체로 만들 수 없다." => Thread 안전하지 않다.
## 빌더 패턴
- 필수 매개변수만으로 생성자(정적 팩터리)를 호출해 빌더 객체를 얻는다.
- 일종의 setter 메서드로 원하는 선택 매개변수를 설정한다.
- build 메서드를 호출해 필요한 객체를 얻는다. (주로 불변)
## 빌더 패턴의 쓰임새
- 계층적으로 설계된 클래스와 함께 사용하기 좋다.
- simulated self-type: 추상 메서드 self를 더해 하위 클래스에서 형 변환없이 메서드 연쇄를 지원한다.
- 재귀적 한정 타입: 자기 자신이 들어간 표현식을 사용해 타입 매개변수의 허용 범위를 한정한다.
- 공변 반환 타이핑(covariant return typing): 하위 클래스의 메서드가 상위 클래스의 메서드가 정의한 반환 타입이 아닌, 하위 타입을 반환하는 기능
## 빌더 패턴의 단점
- 객체를 만들 때 빌더부터 만들어야 하는데, 빌더 생성비용이 크지는 않지만, 성능에 민감한 상황에서는 문제다.
- 매개변수가 4개 이상은 되어야...
'dev book > Effective Java' 카테고리의 다른 글
[Effective Java/아이템6] 불필요한 객체 생성을 피하라 (0) | 2021.09.13 |
---|---|
[Effective Java/아이템5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2021.09.10 |
[Effective Java/아이템4] 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.09.09 |
[Effective Java/아이템3] private 생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2021.09.09 |
[Effective Java/아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2021.09.06 |
댓글 개