필수항목/선택항목으로 이루어진 클래스에서, 선택항목 개수+1 만큼의 생성자를 정의하는 것.
ex) 필수 항목 2개 (int a, b) 선택 항목 3개(int c, d, e)로 구성된 클래스 Words
public class Words {
private final int a; // 필수
private final int b; // 필수
private int c; // 선택
private int d; // 선택
private int e; // 선택
// 필수항목
public Words(int a, int b) {
this(a, b, 0);
}
// 필수항목 + 선택항목 c
public Words(int a, int b, int c) {
this(a, b, c, 0);
}
// 필수항목 + 선택항목 c, d
public Words(int a, int b, int c, int d) {
this(a, b, c, d, 0);
}
// 필수항목 + 선택항목 c, d, e
public Words(int a, int b, int c, int d, int e) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.e = e;
}
}
필드의 개수만큼 생성자의 개수, 파라미터의 개수가 늘어남
매개변수가 없는 생성자로 객체를 만든 후, 세터(setter) 메서드로 필드 값 지정
ex) 클래스 예제
public class Words {
private int a = -1; // 필수
private int b = -1; // 필수
private int c = 0; // 선택
private int d = 0; // 선택
private int e = 0; // 선택
public Words() {}
// 세터 메서드
public void setA(int val) {a = val;}
public void setB(int val) {b = val;}
public void setC(int val) {c = val;}
public void setD(int val) {d = val;}
public void setE(int val) {e = val;}
}
ex) 호출 예제
Words word = new Words();
word.setA(1);
word.setB(2);
word.setC(3);
word.setD(4);
word.setE(5);
가독성은 개선되었으나, 단점 존재
개선방안: freeze - 객체가 완전히 생성되기 전까지 사용할 수 없도록 하는 메서드.
그러나, 컴파일러가 freeze가 제대로 호출되었는지 확인할 수 없으므로 런타임 오류에 취약
사용방법 )
build
메서드를 호출하여 최종 객체 반환ex) 클래스 예제
public class Words {
private final int a; // 필수
private final int b; // 필수
private final int c; // 선택
private final int d; // 선택
private final int e; // 선택
// 빌더 클래스
public static class Builder {
// 필수 매개변수
private final int a;
private final int b;
//선택 매개변수
private int c = 0;
private int d = 0;
private int e = 0;
public Builder(int a, int b) {
this.a = a;
this.b = b;
}
public Builder c (int val) {
c = val; return this;
}
public Builder d (int val) {
d = val; return this;
}
public Builder e (int val) {
e = val; return this;
}
// 빌드 메서드
public Words build() {
return new Words(this);
}
}
private Words(Builder builder) {
a = builder.a;
b = builder.b;
c = builder.c;
d = builder.d;
e = builder.e;
}
}
ex) 호출 예제
Words word = new Words.Builder(1, 2)
.c(3)
.d(4)
.e(5)
.build();
단점)
장점)
처리할 매개변수가 4개 이상인 경우 빌더 패턴을 쓰는 것이 좋다!
조슈아 블로크Joshua Bloch, 『이펙티브 자바 Effective Java 3/E』, 개앞맵시(이복연) 옮김, 인사이트(2018), p14-22.