생성자, 정적 팩터리는 매개변수가 많으면 점층적 생성자 패턴
을 사용한다
점층적 생성자 패턴: 필수 매개변수 1개 생성자, 2개 생생자, 필수 1개와 선택 2개 생성자 ... 이런 식으로 생성자를 많이 두는 패턴
그러나, 매개변수가 많아지면 가독성이 떨어지고 어떤 값을 넘긴 것인지 코드를 작성하기도 어렵다 (심지어 컴파일 타임에는 알 수 없다)
다른 방법으로는 자바빈즈 패턴
을 사용한다.
자바빈즈 패턴: 매개변수가 없는 생성자로 객체를 만든 후, setter 메서드를 통해 원하는 값을 설정하는 패턴
코드 작성이 쉽고, 가독성이 좋아진다.
그러나,
객체 하나를 만들려면 메서드를 여러 개 호출해야한다
객체의 일관성을 유지하기 어렵다(디버깅이 어렵다)
클래스를 불변으로 만들 수 없다
스레드 안정성을 위해 프로그래머가 추가 작업을 해줘야 한다. (Atomic 하게 생성되지 않으므로)
그러므로 점층적 생성자 패턴의 안정성과 자바빈즈 패턴의 가독성을 겸비한 빌더 패턴
을 사용한다.
필수 매개변수만으로 빌더 객체를 얻는다.
빌더 객체가 제공하는 일종의 새터 메서드들로 원하는 매개변수들을 설정한다.
build 메서드를 통해 필요한 객체를 얻는다.
빌더는 생성할 클래스 내 정적 멤버 클래스로 만들어두는 것이 보통이다.
build 메서드에서 유효성을 검사하고 잘못되었다면 IllegalArgumentException을 던진다.
계층적으로 설계된 클래스와 함께 사용하기 좋다
빌더를 따로 생성해야 한다. // 코드가 장황해짐, 성능에 민감하다면 문제가 될 수 있음
핵심 정리
생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다.
빌더는 점층적 생성자보다 코드의 가독성이 좋고, 작성이 편하며, 자바빈즈보다 훨씬 안전하다.
추가.
셀프타입 관용구(simulated self-type) : self 타입이 없는 자바를 위해 self 추상 메서드를 활용해 하위 클래스에서 형변환 없이 메서드 연쇄를 지원하도록 하는 것.
공변 반환 타이핑(covariant return typing) : 하위 클래스의 메서드가 상위 클래스의 메서드가 정의한 반환 타입의 하위 타입을 반환하는 것.