2장 내용을 정리하기 앞서... 그래도 이번 단원은 객체지향 언어를 사용하여 생성자를 생성해본적이 있어선지 그나마..? 이해할 수 있었다.
정적 팩토리와 생성자의 동일한 제약 : 선택할 매개변수가 다양하면 적절히 대응하기가 어렵다...
일반적으로 매개변수가 다양할 경우 점층적 생성자 패턴을 사용하여 생성자를 생성하는데, 이는 매개변수가 늘어날수록 다양한 상황에서의 생성자를 만들어야 할 뿐 더러 설정하고 싶지 않은 변수마저도 설정을 해줘야 한다.
그래서 나온 1번째 대안
이는 좋아 보일 수 있으나 치명적인 단점이 있다.
이는 디버깅의 문제와 더불어 불변으로 만들 수 없어 스레드 안전성을 얻기위해 추가적인 방법(freeze)를 사용해야하는데 이는 런터임 오류가 취약하다...
다음 대안은
여기서 세터 메소드들은 자기 자신 (==return this;)를 반환하여 연쇄적인 ㅍ호풀이 가능하다. 이를 플루언트 메소드 ||메소드 연쇄라 한다.
NutritionFacts cocaCola =new NutritionFacts.Bulfer(240,8).calories(100).sodium(25).carbohydrate(27).build();
이런식으로 생성하니 점층적으로 생성자를 생성하는 것보다 훨씬더 어떤 의도를 가지고 생성하였는지 알 수 있다. 이는 파이썬에서의 명명된 선택적 매개변수를 흉내낸것이다.
아마 test(id=10,subject="math",score=30) 이런식으로 호출할 수 있는 파이썬을 흉내낸건가??
그리고 이는 추상클래스와 하위 클래스에서도 사용하기 편하다.
추상클래스에서는 추상 빌더를, 구체 클래스는 구체 빌더를 갖게하여 계층구조 를 이룰 수 있다.
여기서는 유효성 검사는 생략했는데 일ㅉ기이 잘모ㅅ된걸 발견하려면 생성자와 메소드에서 검사하는게 좋다. vuild에서...? 불변식을 검사하ㅈ??
이부분은 아직 이해가 잘 가진 않는다.