Kotlin에서 가장 적합한 Builder 모드를 생각해 봤습니다.

자바로 작성된 버라이더 모드의 구현은 코틀린으로 대체됐지만, 의외로 정보가 적다는 것을 느껴 이 기회를 틈타 가장 적합한 버라이더 모드를 생각해봤다.
이 기사는 Builder 모드에 대해 자세히 설명하지 않습니다.

전제 조건


이번 Builder 모드의 사용 방법으로는 여러 속성이 있는 반에서 구조기로 모두 지정하는 번거로운 상황에서 가져오는 상황을 고려한다.
예를 들어 사용자 데이터를 처리하는 클래스가 있는데 정보는 다음과 같다.
  • ID
  • 이름
  • 이메일 주소
  • 비밀번호
  • Java의 경우


    Effective Java에 소개된 Builder 모드를 참고하여 구현하면 다음과 같은 느낌을 받을 수 있습니다.
    public class User {
        // 各プロパティを読み取り専用にする
        public final Integer id;
        public final String name;
        public final String email;
        public final String password;
    
        public static class Builder {
            private Integer id;
            private String name;
            private String email;
            private String password;
    
            public Builder setId(Integer id) {
                this.id = id;
                return this;
            }
    
            public Builder setName(String name) {
                this.name = name;
                return this;
            }
    
            public Builder setEmail(String email) {
                this.email = email;
                return this;
            }
    
            public Builder setPassword(String password) {
                this.password = password;
                return this;
            }
    
            public User build() {
                return new User(this);
            }
        }
    
        // コンストラクタを外部から参照できなくする
        private User(Builder builder) {
            this.id = builder.id;
            this.name = builder.name;
            this.email = builder.email;
            this.password = builder.password;
        }
    }
    
    포인트는 다음과 같다.
  • 각 속성을 읽기 전용으로 설정
  • 이후에 다시 쓸 수 없어 의외의 변경을 방지
  • // 各プロパティを読み取り専用にする
    public final Integer id;
    public final String name;
    public final String email;
    public final String password;
    
  • 외부에서 구조기를 참조할 수 없음
  • Builder를 통해 인스턴스 생성 필요
  • private User(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.email = builder.email;
        this.password = builder.password;
    }
    

    Kotlin의 경우


    Kottlin에서 이러한 사항을 구현하면 다음과 같습니다.
    data class User private constructor(val id: Int, val name: String, val email: String, val password: String) {
    
        class Builder() {
            private var id = 0
            private var name = ""
            private var email = ""
            private var password = ""
    
            fun setId(id: Int): Builder {
                this.id = id
                return this
            }
    
            fun setName(name: String): Builder {
                this.name = name
                return this
            }
    
            fun setEmail(email: String): Builder {
                this.email = email
                return this
            }
    
            fun setPassword(password: String): Builder {
                this.password = password
                return this
            }
    
            fun build(): User {
                return User(id, name, email, password)
            }
        }
    }
    
    이 행은 읽기 전용 속성, 외부 참조 구조자를 압축합니다.
    Java와 달리 User 레벨 구조기의 매개 변수는 Builder가 아닙니다. (Builde r 레벨의 속성에 접근할 수 없기 때문입니다.)
    data class User private constructor(val id: Int, val name: String, val email: String, val password: String)
    
    또한 데이터를 분류함으로써 로그 출력과 비교 등을 쉽게 실현할 수 있다.
    하지만 경고Private data class constructor is exposed via the generated 'copy' method.가 나온다.
    이곳이 허용될 수 있을지 없을지는 사건이다.

    총결산


    Kotlin에 가장 적합한 Builder 모드를 고려해 보았습니다.나는 포인트가 다음과 같은 두 가지가 있다고 생각한다.
  • 각 속성을 읽기 전용으로 설정
  • 외부 참조 구조기에서 사용할 수 없음
  • Java로 쓸 때와 Kotlin으로 쓸 때는 Kotlin이 유창하게 쓴다.
    또 같은 방문 수식자라도 언어에 따라 행동이 다르다는 것을 확인했다.
    더 좋은 Builder반의 문법이 있다면 의견을 제시해 주세요.

    참조 페이지

  • QOL 급상승하는 Kotlin Tips 제안-Qita
  • Builder의 창의적인 디자인 모델 - 개발자 문서
  • Kotlin 데이터 클래스에 공장 비법을 준비하려고 합니다. - Qita.
  • 좋은 웹페이지 즐겨찾기