※ 참고: “Effective Java 2nd Edition”을 읽으면서 쓴 글입니다.
정적 팩터리 메서드와 생성자는 공통된 제한 사항을 공유합니다.
- 선택 가능한 파라미터가 많으면 유연하게 처리할 수 없습니다.
- 포장 식품에 대한 영양 정보를 나타내는 클래스의 경우를 고려하십시오.
- 레이블에는 다음과 같은 여러 필수 필드가 있습니다.
B. 식품의 양, 개수 및 칼로리. - 대부분의 음식은 몇 가지 선택적 필드에 대한 값만 가지고 있습니다.
- 이러한 클래스에 대한 생성자 또는 정적 팩터리 메서드를 만들려면 어떻게 해야 합니까?
- 지금까지 프로그래머는 텔레스코핑 생성자 패턴을 사용했습니다.
- 즉, 필수 매개변수만 있는 생성자, 필수 매개변수와 하나의 선택적 매개변수가 있는 생성자, 필수 매개변수와 두 개의 선택적 매개변수가 있는 생성자 등 강아지의 생성자를 오버레이하기 위한 것입니다.
매개변수화된 생성자에 대한 두 번째 대안은 JavaBeans 패턴입니다.
- 이 패턴에서는 매개변수 없는 생성자를 호출하여 객체를 생성한 다음 setter 메서드를 호출하여 각 필수 필드와 선택적 필드의 값을 지정합니다.
- 이 패턴은 telescope 생성자 패턴의 단점이 전혀 없고 코드가 다소 길지만 다음과 같이 인스턴스화가 쉽고 코드를 읽을 수 있습니다.
JavaBeans 패턴의 단점
- 인스턴스는 여러 메서드 호출로 분할하여 생성되기 때문에 JavaBean 개체는 생성 프로세스 전체에서 일관된 상태를 유지하지 못할 수 있습니다.
- 이는 클래스가 일관성을 보장하기 위해 생성자 매개변수의 유효성을 검사할 기회조차 없기 때문입니다.
또한 일관성이 없는 상태의 개체를 사용하려고 하면 오류를 찾기 어려운 문제가 발생할 수 있습니다.
- 이와 관련하여 JavaBeans 패턴은 불변 클래스를 생성할 수 있는 기능을 제거하므로 스레드 안전성을 유지하기 위해 프로그래머 측에서 추가 노력이 필요한 단점이 있습니다.
- 객체가 완전히 생성되었을 때 고정하고 완료될 때까지 사용하지 않음으로써 이러한 단점을 완화할 수 있습니다.
그러나 이 방법은 사용하기 어렵고 런타임 오류가 발생할 수 있기 때문에 실제로는 거의 사용되지 않습니다.
- 객체를 사용하기 전에 프로그래머가 freeze 메서드를 호출했는지 여부를 컴파일러에서 확인할 수 없기 때문입니다.
- 다행스럽게도 Telescoping 생성자 패턴의 보안성과 JavaBeans 패턴의 가독성을 결합한 세 번째 접근 방식이 있습니다.
빌더 패턴
- 원하는 개체를 직접 구성하는 대신 클라이언트는 필요한 매개 변수를 사용하여 생성자를 호출하여 빌더 개체를 가져옵니다.
- 그런 다음 빌더 개체의 setter 메서드를 호출하여 필수 선택적 매개 변수의 값을 설정합니다.
- 마지막으로 클라이언트는 매개 변수 없는 생성 메서드를 호출하여 불변 객체를 생성합니다.
- 빌더는 작성하는 객체의 클래스에 포함된 정적 멤버 클래스입니다.