아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라
2021-04-03 00:00:00 # Effective_Java

정적 팩터리와 생성자의 공통적 제약

1) 필요한 매개변수 갯수에 따라 생성자를 작성

  • 코드가 길어져도 사용은 되지만, 매개변수 갯수가 많아지면 모든 매개변수의 순서를 이해하고 작성해야 해서 클라이언트 코드를 작성하기가 어려워진다.

2) 자바 beans 패턴을 통해 좀더 개선해본다면?

  • setter() 활용
  • NutritionFactsWithBeans 클래스 참고
  • 객체 하나를 만들려면 메서드를 여러 개 호출해야 한다.
  • 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.
    1. 에서는 매개변수가 유효한지 생성자에서만 확인하면 되었는데, 빈즈 패턴에서는 바로 확인이 안된다.
  • 자바빈즈 패턴에서는 클래스를 불변으로 만들 수 없고, thread 안정성을 위해 추가 작업이 요구된다. [아이템 17]

3) 빌더 패턴 (Builder Pattern)

  • GoF의 디자인 패턴에도 나와있다.
  • Lombok의 @Builder
  • NutritionFactsWithBuilder 클래스 참고
  • 계층적으로 설계된 클래스와 함께 쓰기 좋다.
  • 단점: 빌더를 미리 만들어야 한다.
    • 빌더 생성 비용이 크지는 않지만, 성능에 민감한 상황에서는 문제가 될 수 있다.
    • 매개변수가 4개 이상은 되어야 값어치를 한다. (but API는 시간이 지날수록 매개변수가 많아지기도 한다!)

핵심 정리

생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면(많아질 것이라 예상된다면) 빌더 패턴을 선택하는 게 더 좋다.