생성자 체이닝과 자바빈즈
- 정적 팩터리 메서드와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안
- 대안1: 점층적 생성자 패턴 또는 생성자 체이닝
- 매개변수가 적은 생성자가 매개변수가 많은 생성자를 점진적으로 호출하는 방식
- 매개변수가 늘어나면 클라이언트 코드를 작성하거나 읽기 어려움
- 동일한 타입의 필드가 여러 개 있을 경우 어느 위치에 어느 값이 매칭되는지 알기 어려움
- 점층적으로 포함하고 있는 형태이기 때문에 불필요한 값도 같이 지정해주어야 함
- 대안2: 자바빈즈 패턴
- 필드에 값을 지정하지 않는 생성자 + setter 메서드 활용하여 객체 생성
- 완전한 객체를 만들려면 메서드를 여러번 호출해야 함
- 일관성이 무너진 상태가 될 가능성이 있음
- 필수 필드의 값이 지정되었는지 보장할 수 없음
- 대안3: 점층적 생성자 패턴 + 자바빈즈
- 필수값은 생성자로 받아오며, 선택값은 setter 메서드로 받아오는 방법
- 클래스를 불변으로 만들 수 없음
빌더 패턴
- 플루언트 API 또는 메서드 체이닝
- 계층적으로 설계된 클래스와 함께 사용하기 좋음
- 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고 자바빈즈보다 훨씬 안전
- 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법
- 복잡한 객체를 만드는 프로레스를 독립적으로 분리할 수 있음

롬복 빌더 어노테이션의 단점
- 빌더 코드를 간결하게 작성하기 위해 롬복을 활용할 수 있으나 롬복 사용 시 모든 필드를 가지는 public 기본 생성자가 포함됨
- 복잡한 기본 생성자를 지양하기 위해 빌더를 만들었으나 결과적으로 생성자를 열어주는 방법이 될 수 있음
- 마찬가지로 롬복에서 제공하는 AllArgs.. 어노테이션을 private 으로 지정하여 막을 수 있음
- 필수 필드를 지정할 수 없음
자바빈 (JavaBean)
- (주로 GUI 에서) 재사용 가능한 소프트웨어 컴포넌트
- java.beans
- 자바 빈이 지켜야 할 규약
- 아규먼트가 없는 기본 생성자
- getter 와 setter 메서드 이름 규약
- 해당 규약을 따라야 GUI 등에서 해당 스팩에 맞춰 값에 접근할 수 있음
- boolean 의 getter 의 경우 isXXX
- Serializable 인터페이스 구현
- 요즘에는 GUI 보다는 API, Framework 등에서 사용하기 때문에 모든 자바 빈 규약을 지킬 필요는 없음
- 최근까지 자바빈 스팩 중 getter 와 setter 를 주로 사용하는 이유
- JPA 나 스프링과 같은 여러 프레임워크에서 리플렉션을 통해 특정 객체의 값을 조회하거나 설정하기 때문
객체 얼리기 (freezing)