생성자 매개변수가 많을 때,
다음과 같은 클래스가 있다면 5개의 매개변수를 가진 생성자를 만들게 될 것이다.
public class Order {
private final Long id;
private final String username;
private final int menuId;
private final int quantity;
private final int price;
}
생성자를 만드는 것 까진 문제가 되지않는다고 하자, 하지만 문제는 객체생성을위해 생성자를 호출할 때 생기게된다.
Order order = new Order(1L,"userName",30,20,10);
몇번째 매개변수가 어떤 값을 지칭하는지 시각적으로 나타나지 않는다. 순서를 바꿔넣어도 바뀌었는지 전혀 알 방도가 없다.
이럴 때 사용하는게 빌드 패턴이다.
public class Order {
private final Long id;
private final String username;
private final int menuId;
private final int quantity;
private final int price;
public static class Builder {
//필수 값만 final
private final Long id;
private String username;
private int menuId;
private int quantity;
private int price;
public Builder(Long id) {
this.id = id;
}
public Builder username(String username) {
this.username = username;
return this;
}
// 메소드 중략
public Order build() {
return new Order(this);
}
}
// 생성자를 private로 선언, 외부 호출을 막는다.
private Order(Builder builder) {
this.id = builder.id;
this.username = builder.username;
this.menuId = builder.menuId;
this.quantity = builder.quantity;
this.price = builder.price;
}
}
Order 클래스가 좀 복잡해졌지만, 빌드 패턴을 통해 얻는 효과는 강력하다.
Order order = new Order.Builder(1L)
.username("userName")
.menuId(20)
.quantity(30)
.price(4000)
.build();
위와같이 어떤값에 매핑되는지 한눈에 알 수 있어, 다른 변수에 값을 매핑하는 실수를 방지할 수 있다. 값이 아니라 변수로 변환해서 지정한다면 틀릴확률은 0%에 가까울 것이고, 만에하나 틀린다고 해도 쉽게 디버깅 할 수 있는 장점을 갖고 있다.
알고리즘 문제를 풀면서 사용한 StringBuilder가 대표적인 빌더 패턴이 적용된 사례이다.
728x90
'[도서] > [Effective Java]' 카테고리의 다른 글
[Effective Java] 정적 팩토리 메서드 (0) | 2021.04.07 |
---|