발견
@Builder의 선언위치에 따른 차이
Dev_Green
2023. 5. 26. 17:00
@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;
}
}