공부기록

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 본문

JAVA

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

gracelove91 2019. 11. 26. 23:02
반응형

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

정적팩터리와 생성자의 문제?

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

문제해결하기

  • 점층적 생성자 패턴
    • 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자 ... 이런 식으로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식.
    • 매개변수가 많아지면 코드를 작성하거나 읽기 어렵다.
public class Solution {
    private int a,b,c,d;

    Solution() { 
        this(0,0,0,0);
    }
    Solution(int a) {
        this(a,0,0,0);
    }
    Solution(int a, int b) {
        this(a,b,0,0);
    }
    ...
}
  • 자바빈즈패턴
    • 매개변수 없는 생성자로 객체를 만든 뒤 세터 메서드들로 각 값을 설정하는 것.
    • 객체 하나를 완성시키려면 메서드를 여러개 호출해야한다.
    • 객체가 완전히 생성되기 전까지 일관성(Consistency)이 무너진 상태가 된다.
    • 일관성이 무너지는 문제때문에 불변으로 만들 수 없다.
public class Solution {
    private int a,b,c,d;

    Solution() {}

    public void setA(int a) {
        this.a = a;
    }

    ...
}
  • 빌더패턴
    • 순서
      1. 필수 매개변수만으로 생성자(혹은 정적 팩터리)를 호출해 빌더객체를 얻는다.
      2. 빌더객체가 제공하는 일종의 세터메서들로 값을 설정한다.
      3. 마지막으로 매개변수가 없는 build메서드를 호출해서 완성된 객체를 얻는다.
public class Solution {
    private int a,b,c,d;

    public static class Builder {
        //필수매개변수
        private int a;

        //선택매개변수
        private int b = 0;
        private int c = 0;
        private int d = 0;

        Builder(int a) { this.a = a;    }

        Builder b(int b) { 
            this.b = b;
            return this;
        }
        Builder c(int c) {
            this.c = c;
            return this;
        }
        Builder d(int d) {
            this.d = d;
            return this;
        }

        Solution build() {
            return new Solution(this);
        }
    }

    private Solution(Builder builder) {
        this.a = builder.a;
        this.b = builder.b;
        this.c = builder.c;
        this.d = builder.d;
    }

    ...
}

정리

  • 생성자나 정적 팩터리가 처리해야할 매개변수가 많다면 빌더패턴을 선택하는 게 낫다.
  • 코드가 장황하고, 객체를 만들기 앞서 빌더 객체를 만들어야한다는 단점이 있지만, API는 시간이 지날 수록 매개변수가 많아지는 경향이 있음을 명심할 것. 애초에 빌더패턴으로 시작하는 편이 나을 때가 많다.
반응형