Lombok의 @Builder 어노테이션 적용하지 않고 순수 빌더패턴을 사용하는 경우
@Data
public class User {
private String name;
private String address;
private int age;
public User(Builder builder) {
this.name = builder.name;
this.address = builder.address;
this.age = builder.age;
}
public static class Builder {
private String name;
private String address;
private int age;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public User build() {
return new User(this);
}
}
}
@Test
public void builderTest() {
User user = new User.Builder()
.name("김개똥")
.address("서울시 강남구")
.age(50)
.build();
System.out.println(user); // {User(name=김개똥, address=서울시 강남구, age=50)}
}
Lombok의 @Builder 어노테이션을 사용하여 빌더패턴을 구현한 경우
@Data
public class User {
private String name;
private String address;
private int age;
@Builder
public User(Builder builder) {
this.name = builder.name;
this.address = builder.address;
this.age = builder.age;
}
}
@Test
public void builderTest() {
User user = User.builder()
.name("김개똥")
.address("서울시 강남구")
.age(50)
.build();
System.out.println(user); // {User(name=김개똥, address=서울시 강남구, age=50)}
}
@Builder를 사용하지 않고 빌더패턴으로 User를 생성할 때는 new User.Builder().build() 방식이지만, @Builder를 사용하여 User를 생성할 때는 new User.builder().build() 방식입니다.
이러한 차이가 발생하는 이유는 @Builder 어노테이션이 내부적으로 아래의 정적 메서드까지 만들어 놓았기 때문입니다.
public static User.UserBuilder builder() {
return new User.UserBuilder();
}