우리가 여태까지 클래스를 생성할 때에는 생성자를 만들 때 정해뒀던 파라미터 순서에 따라 변수를 집어넣어 생성해줘야했다.
public class User{
private String id;
private String email;
public User(String id, String email){
this.id=id;
this.email =email;
}
}
public static void main(String[] args){
User user1 = new User("1001","1@gmail.com");
}
근데 이러면 IDE에서는 몰라도, 생성자를 호출 할 때 어떤 순서로 파라미터를 적어야하는지 알기 좀 귀찮다.
그래서 쓰는게 빌더패턴!
최종적으로 필요한 필드를 가지고 있는 객체를 만들기 위한 내부 클래스를 만들면 된다!
public class User{
private String id;
private String email;
public User(String id, String email){
this.id=id;
this.email =email;
}
static public class Builder{
private String id;
private String email;
public Builder();
public Builder(User user){
this.id=user.id;
this.email=user.email;
}
//setXXX대신 필드명으로 메소드를 작성함!
public Builder id(String id){
this.id = id;
return this;
}
public Builder email(String email){
this.email=email;
return this;
}
public User build(){
return new User(id,email);
}
} //빌더 클래스 선언 완
}
그러면 이제
public static void main(String args[]){
//기존 생성자
User user1 = new User("1001","1@gmail.com");
//빌더 패턴을 이용한 생성자
User user2 =new User.Builder()
.id("1002")
.email("2@gmail.com")
.build();
}
로 직관적으로 만들 수 있다.
클래스 위에 어노테이션을 달 경우 - 모든 필드를 사용하겠다
사용자 정의 생성자 위에 어노테이션을 달 경우 - 선택적으로 필드를 사용하겠다
즉, null값이 있을수도 있는 생성자라면, 클래스보다는 사용자 정의 생성자 위에 어노테이션을 달아줘야한다.
또, @Builder를 통해 실제 빌더 생성자 호출 시 Builder가 아닌 builder로 나오며, new를 사용하지 않아도 된다.