Java

[Effective Java] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라.

quedevel 2022. 5. 24. 10:31
728x90
반응형

if. 생성자의 매개변수가 많다면 ❓

public class User {

    private long userSn;
    private String userId;
    private String userPw;

    public User(long userSn) {
        this.userSn = userSn;
    }

    public User(long userSn, String userId) {
        this.userSn = userSn;
        this.userId = userId;
    }

    public User(long userSn, String userId, String userPw) {
        this.userSn = userSn;
        this.userId = userId;
        this.userPw = userPw;
    }
}
  • 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.

대안 ❗

1️⃣ 자바빈즈 패턴

public class User {

    private long userSn;
    private String userId;
    private String userPw;

    public void setUserSn(long userSn) {
        this.userSn = userSn;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public void setUserPw(String userPw) {
        this.userPw = userPw;
    }
}
  • 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.

2️⃣ 빌더 패턴

public class User {

    private long userSn;
    private String userId;
    private String userPw;

    public User(Builder builder){
        this.userSn = builder.userSn;
        this.userId = builder.userId;
        this.userPw = builder.userPw;
    }

    public static class Builder {
        public long userSn;
        public String userId;
        public String userPw;

        private Builder() {
        }

        public Builder with(Consumer<Builder> consumer){
            consumer.accept(this);
            return this;
        }

        public User build(){
            return new User(this);
        }
    }
}
  • 빌더는 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고, 자바빈즈보다 훨신 안전하다.

참고 자료

Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, 프로그래밍인사이트(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=

728x90
반응형