위 두 상황일 때, 빌더 패턴을 추천한다.
Person p = new Person.Builder().setAge(12).setName("Wang").build();
build() 메서드가 수행되야 객체가 생성되므로 멀티 쓰레드 환경에서도 안전하다.
빌더 패턴으로 생성한 객체를 보면 어떤 프로퍼티로 구성되어 있는지 알 수 있다.
public class Person{
private String name;
private String email;
private int age;
public Person(Builder builder){
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
}
public static class Builder{
private final String name;
private final String email;
private int age;
public Builder(String name,String email){
this.name = name;
this.email = email;
}
// public setter, getter
public Builder setAge(int age){
this.age = age;
return this;
}
public Person build(){
return new Person(this);
}
}
}
Builder 클래스에서 name,email은 필수 값이므로 final을 붙였다.
만약 새로운 필드를 추가하고 싶다면 Builder의 set메서드를 만들면 된다.
Person p = new Person.Builder("name","email").setAge(20).build();
builder 패턴은 static inner class를 이용한다.
텔레스코핑 생성자를 사용할 필요가 없다. 불변 객체를 만드는 빌더패턴을 사용하자