본문 바로가기
[도서]/[Effective Java]

[Effective Java] 빌드 패턴

by dop 2021. 4. 7.

생성자 매개변수가 많을 때,

다음과 같은 클래스가 있다면 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