정리 - chap 02.

MinSeoCho·2021년 7월 16일
0

Effective Java 정리

목록 보기
2/2
post-thumbnail

2장 내용을 정리하기 앞서... 그래도 이번 단원은 객체지향 언어를 사용하여 생성자를 생성해본적이 있어선지 그나마..? 이해할 수 있었다.

생성자에 여러개의 매개변수가 들어가면 빌더를 고려하자.

정적 팩토리와 생성자의 동일한 제약 : 선택할 매개변수가 다양하면 적절히 대응하기가 어렵다...

일반적으로 매개변수가 다양할 경우 점층적 생성자 패턴을 사용하여 생성자를 생성하는데, 이는 매개변수가 늘어날수록 다양한 상황에서의 생성자를 만들어야 할 뿐 더러 설정하고 싶지 않은 변수마저도 설정을 해줘야 한다.

  • 점층적 패턴도 사용은 가능하나, 클라이언트 코드를 읽기 어려워진다.

그래서 나온 1번째 대안

자바빈즈 패턴

  1. 매개변수가 없는 생성자로 객체를 생성한다.
  2. 후에 setter 메소드를 호출하여 매개변수 값을 설정한다.

이는 좋아 보일 수 있으나 치명적인 단점이 있다.

  1. 객체 1개를 생성하기 위해 여러 메소드를 호출해야한다.
  2. 객체가 완전히 생성되기 전까진 일관성이 무너진다.

이는 디버깅의 문제와 더불어 불변으로 만들 수 없어 스레드 안전성을 얻기위해 추가적인 방법(freeze)를 사용해야하는데 이는 런터임 오류가 취약하다...

다음 대안은

빌더 패턴

  1. 필수 매개변수만으로 생성자 || 정적 팩토리를 호출하여 빌더 객체 생성
  2. 객체가 제공하는 세터 메소드들로 원하는 선택 매개변수 설정
  3. 매개변수가 없는 build메소드를 호출하여 객체(불변)를 얻는다.

여기서 세터 메소드들은 자기 자신 (==return this;)를 반환하여 연쇄적인 ㅍ호풀이 가능하다. 이를 플루언트 메소드 ||메소드 연쇄라 한다.

NutritionFacts cocaCola =new NutritionFacts.Bulfer(240,8).calories(100).sodium(25).carbohydrate(27).build();

이런식으로 생성하니 점층적으로 생성자를 생성하는 것보다 훨씬더 어떤 의도를 가지고 생성하였는지 알 수 있다. 이는 파이썬에서의 명명된 선택적 매개변수를 흉내낸것이다.

아마 test(id=10,subject="math",score=30) 이런식으로 호출할 수 있는 파이썬을 흉내낸건가??

그리고 이는 추상클래스와 하위 클래스에서도 사용하기 편하다.

추상클래스에서는 추상 빌더를, 구체 클래스는 구체 빌더를 갖게하여 계층구조 를 이룰 수 있다.

여기서는 유효성 검사는 생략했는데 일ㅉ기이 잘모ㅅ된걸 발견하려면 생성자와 메소드에서 검사하는게 좋다. vuild에서...? 불변식을 검사하ㅈ??

이부분은 아직 이해가 잘 가진 않는다.

profile
열심히 하자..!

0개의 댓글