@Builder.Default

warning: @Builder will ignore the initializing expression entirely.

프로젝트를 진행하던 도중 위와같은 경고를 마주치게 되었다 (에러는 아니다). 그리고 이어서 다음 조언들이 적혀 있었다.

If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.

@Builder 어노테이션의 Default 옵션을 사용하라는 말인데, 이를 이해하기 위해서 @Builder 어노테이션의 성질을 이해할 필요가 있었다.

 

생성자를 사용할 때에는 객체를 생성할 때 모든 필드의 값을 한 번에 초기화 해야 하지만,

(필드 값을 초기화 하지 않으면 객체의 상태가 정의되지 않은 불완전한 상태가 된다)

빌더 패턴을 사용할 때에는 필요한 필드의 값을 순차적으로 설정할 수 있다.

 


 

예를 들어 다음과 같은 User 클래스가 있고, User 객체를 생성할 때 Builder 패턴을 사용한다고 하자.

public class User {
    private final String name;
    private final int age;
    private final String email;

    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
    public String getEmail() { return email; }

    public static class Builder {
        private String name;
        private int age;
        private String email;

        public Builder name(String name) {
            this.name = name;
            return this;
        }
        public Builder age(int age) {
            this.age = age;
            return this;
        }
        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

이렇게 Builder 패턴을 사용하게 되면 모든 필드를 초기화 하지 않고도 User 객체 user를 생성할 수 있다.

다음은 age 필드를 초기화 하지 않고 name과 email 필드만 초기화 하여 User 객체 user를 생성하는 코드이다.

User user = new User.Builder()
                .name("John")
                .email("john@example.com")
                .build();

이 경우, age 필드의 값은 int의 기본값인 0으로 초기화된다.

 

 


 

 

이제 아까 만났던 경고문의 의미를 이해할 수 있다.

@Builder will ignore the initializing expression entirely.

즉 @Builder 어노테이션은 생성자 대신 빌더 패턴을 사용하여 객체를 생성하게 해주므로

미리 초기화 과정에서 지정해준 값을 무시하고 자동 초기값으로 생성을 한다.

이 때 @Builder 어노테이션을 Default 옵션과 함께 사용해 준다면, Builder 패턴으로 객체를 생성할 때, 해당하는 값을 기본값으로 적용할 수 있다.

 

'Java > 문법, 자료구조, 알고리즘' 카테고리의 다른 글

Builder 패턴과 @Builder 어노테이션  (0) 2023.04.15
BufferedReader로 입력 받을 때 NPE 방지하기  (0) 2023.04.04
Tree, BinaryTree  (0) 2023.04.02
PriorityQueue  (0) 2023.04.01
== 와 .equals() 차이  (0) 2023.03.28