Home [Effective Java] Item02. 생성자에 매개변수가 많다면 빌더를 고려하라!
Post
Cancel

[Effective Java] Item02. 생성자에 매개변수가 많다면 빌더를 고려하라!

Item02. 생성자에 매개변수가 많다면 빌더를 고려하라!

선택적 매개변수가 많을 경우 적절히 대응하기 어렵다.

패턴

  1. 점층적 생성자 패턴을 사용한다.

    • 필수 매개변수만 받는 생성자 ~ 필수 매개변수와 선택적 매개변수까지 받는 생성자까지 매개변수를 늘려가는 방식이다.
    • 사용을 원하지 않는 매개변수일지라도, 생성자가 필요로 하면 넣어야 함.
    • 이러한 방식은 매개변수가 많아지면 클라이언트 코드를 작성하거나 읽기 어려워진다.
  2. 자바빈즈 패턴

    • 매개변수 없는 생성자 만들고, setter를 통해 원하는 매개변수 값 설정하는 방식
    • 객체 하나를 생성하려면 메서드 여러 개 호출 필요 -> 객체 완전 생성 시까지 일관성 무너진 상태가 유지됨 -> 심각한 단점
    • 즉, 클래스를 불변으로 만들 수 없음.
    • freezing 기법의 사용을 통해 수동으로 문제를 해결할 수 있으나 잘 쓰이지 않음.
  3. 빌더 패턴

    • 점층적 생성자 패턴의 안전성 + 자바빈즈 패턴의 가독성 겸비
    • 필수 매개변수 만으로 생성자 혹은 정적 팩터리를 호출해 빌더 객체를 얻는다. -> 그 후 세터 메소드로 원하는 선택 메서드를 설정한다. -> 매개변수가 없는 build 메서드를 호출해 객체를 얻는다.
    • 빌더는 생성할 클래스 안에 정적 멤버 클래스로 만들어두는 것이 보통임.

    • 빌더의 세터 메서드는 빌더 자신을 반환한다. 때문에 연쇄적 호출이 이뤄지고, 이러한 방식을 플루언트 API 혹은 메서드 연쇄라 부른다.
    • 계층적으로 설계된 클래스와 잘 어울리는 패턴이다.

    • 하위 클래스의 메서드가 상위 클래스의 메서드에서 정의한 반환 타입이 아닌, 그 하위 타입을 반환하는 경우 공변 반환 타이핑이라 한다.
    • 공변 반환 타이핑 이용 시 클라이언트는 형변환에 신경 쓰지 않고도 빌더를 사용할 수 있다.
    • 빌더 패턴을 이용하면 가변인수 매개변수를 여러 개 사용할 수 있다는 이점 존재. -> 각각을 적절한 메서드로 선언해 처리하거나 메서드를 여러 번 호출해 넘겨진 매개변수를 하나의 필드로 모으는 방법 존재
    • 빌더 생성 비용이 그리 크지는 않지만 성능에 민감한 상태에서는 빌더 생성이 영향을 끼칠 수 있다.
    • 점층적 방식과 비교 시 코드가 장황하고, 매개변수가 4개 이상 되어야 빌더 패턴 사용의 이점이 드러난다.
This post is licensed under younghwani by the author.

[Effective Java] Item01. 생성자 대신 정적 팩터리 메서드를 고려하라!

[Effective Java] Item03. private 생성자나 열거 타입으로 싱글턴임을 보증하라!

Comments powered by Disqus.