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;
}
...
}
- 빌더패턴
- 순서
- 필수 매개변수만으로 생성자(혹은 정적 팩터리)를 호출해 빌더객체를 얻는다.
- 빌더객체가 제공하는 일종의 세터메서들로 값을 설정한다.
- 마지막으로 매개변수가 없는
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는 시간이 지날 수록 매개변수가 많아지는 경향이 있음을 명심할 것. 애초에 빌더패턴으로 시작하는 편이 나을 때가 많다.
반응형