티스토리 뷰
2. 생성자 인자가 많을때는 빌더 패턴
생성자에 들어가는 파라미터 개수가 많을 경우 사용해볼만한 패턴은 다음과 같다
1. 점층적 생성자 패턴
- 필수 인자만 받는 생성자 하나 정의
- 그 이후부터 선택적 인자를 추가해가면서 생성자를 계속 쌓아나가는 방식
- 각 파라미터가 무슨 값인지 의미를 알기 어렵고, 자료형이 같은 인자들끼리 순서를 잘못 넣어 문제를 일으킬 가능성이 상당히 높다.
2. 자바빈 패턴
- 일단 인자 없는 생성자(NoArgsConstructor)를 호출해서 빈 객체를 만듬
- 그 다음에 setter 프로퍼티를 이용해서 값을 하나하나 채워주는 방식
- 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체의 일관성이 일시적으로 깨질 수 있다.
- 변경 불가능(immutable)한 클래스를 만들 수 없다
3. 빌더 패턴
- 점층적 생성자 패턴의 안정성과 자바빈 패턴의 가독성을 결합
- 클라이언트가 필요한 객체를 직접 생성하는 대신, 필수 인자들을 전달하여 빌더 객체(Builder Object)를 만든 뒤, 빌더 객체에 정의된 설정 메서드들을 호출하여 선택적 인자들을 추가해나가는 방식.
- 메서드 체인(Method Chaining)방식으로 메서드를 계속 호출하면서 각 필드의 이름과 인자를 매핑할 수 있다.
public class User {
private final String name;
private final String tel;
private final String birth;
private final String address;
public static class Builder {
// 필수 인자
private final String name;
private final String tel;
// 선택 인자
private String birth;
private String address;
public Builder(String name, String tel) {
this.name = name;
this.tel = tel;
}
public Builder birth(String birth) {
this.birth = birth; return this;
}
public Builder address(String address) {
this.address = address; return this;
}
public User build() {
return new User(this);
}
}
private User(Builder builder) {
name = builder.name;
tel = builder.tel;
birth = builder.birth;
address = builder.address;
}
}
////////////
public static void main(String[] args) {
User user = new User.Builder("name", "tel")
.address("address")
.birth("birth").build();
}
- 가독성이 아주아주 뛰어나다
- 불변 객체를 만들 수 있다. (필드에 final이 붙어있기 때문에 Setter 등을 통해 값이 변경될 수 없다)
-> 변경점을 최소화하고 유지보수를 용이하게 만들어준다!!
* Lombok을 이용하면 아주 편리하게 빌더패턴을 이용할 수 있다. (@AllArgsConstructor 필요)
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class User {
private final String name;
private final String tel;
private final String birth;
private final String address;
}
모든 값을 채우지 않고도 객체를 생성할 수 있으며, 이 경우 채워지지 않은 값은 null로 할당된다.
-> 매우 유연한 객체 생성 가능. 하나의 빌더 객체로 여러 형태의 객체를 만들어낼 수 있다.
<단점>
1. 객체를 생성하기 위해서는 빌더 객체를 먼저 생성해야 한다. 극한의 성능을 따지는 순간에서는 문제가 될수도?
2. 코드가 길어지는건 어쩔 수 없다. 인자가 한두개인 경우는 굳이 쓸 필요가 없다.
'JAVA' 카테고리의 다른 글
객체 생성을 막을때는 private 생성자 (0) | 2022.07.15 |
---|---|
싱글톤은 Enum 타입으로 만들어라 (0) | 2022.07.15 |
생성자 대신 정적 팩토리 메서드 (0) | 2022.07.15 |
JAVA의 예외 처리란? (1) | 2021.11.26 |
인터페이스란? (0) | 2021.11.25 |