아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라
2021-04-03 00:00:00
# Effective_Java
정적 팩터리와 생성자의 공통적 제약
- 선택적 매개변수가 많을 때 적절히 대응하기가 어렵다.
- NutritionFacts 클래스 참고
1) 필요한 매개변수 갯수에 따라 생성자를 작성
- 코드가 길어져도 사용은 되지만, 매개변수 갯수가 많아지면 모든 매개변수의 순서를 이해하고 작성해야 해서 클라이언트 코드를 작성하기가 어려워진다.
2) 자바 beans 패턴을 통해 좀더 개선해본다면?
- setter() 활용
- NutritionFactsWithBeans 클래스 참고
- 객체 하나를 만들려면 메서드를 여러 개 호출해야 한다.
- 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.
- 에서는 매개변수가 유효한지 생성자에서만 확인하면 되었는데, 빈즈 패턴에서는 바로 확인이 안된다.
- 자바빈즈 패턴에서는 클래스를 불변으로 만들 수 없고, thread 안정성을 위해 추가 작업이 요구된다. [아이템 17]
3) 빌더 패턴 (Builder Pattern)
- GoF의 디자인 패턴에도 나와있다.
- Lombok의 @Builder
- NutritionFactsWithBuilder 클래스 참고
- 계층적으로 설계된 클래스와 함께 쓰기 좋다.
- 단점: 빌더를 미리 만들어야 한다.
- 빌더 생성 비용이 크지는 않지만, 성능에 민감한 상황에서는 문제가 될 수 있다.
- 매개변수가 4개 이상은 되어야 값어치를 한다. (but API는 시간이 지날수록 매개변수가 많아지기도 한다!)
핵심 정리
생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면(많아질 것이라 예상된다면) 빌더 패턴을 선택하는 게 더 좋다.