본문 바로가기
발견

@Builder의 선언위치에 따른 차이

by Dev_Green 2023. 5. 26.

@Builder의 선언위치

@Builder는 Class에 선언할 수도 있고, Class의 Constructor에 선언할 수도 있다.

Class에 선언

@Builder
public class Person {
    private int id;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

위와 같이 Class에 @Builder를 선언할 경우 문제점이 있는데, 아래 이미지처럼 Class의 모든 필드가 builder에 노출된다는 것이다.

인스턴스를 생성할 때 인자로 받고 싶지 않은 필드가 있을 경우, @Builder를 Constructor에 선언함으로써 해결할 수 있다.

Constructor에 선언

public class Person {
    private int id;
    private String name;
    private int age;

    @Builder
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

위와 같이 id가 인자에 포함되지 않은 Constructor에 @Builder를 생성할 경우 builder()에 id가 노출되지 않는다.

 

추가로 아래와 같이 @Builder.Default를 선언하면 builder()를 통해 객체가 생성될 때 값이 지정되지 않은 경우 미리 설정해놓은 값으로 할당된다.

public class Person {
    @Builder.Default
    private int id = 0;
    private String name;
    private int age;

    @Builder
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}