참고: 유튜브로 보기 (상단 이미지 클릭)
정적 팩터리 메소드와 생성자는 공통적인 제약이 있음.
선택적 매개변수가 많을 경우 표현 방식의 유연성이 떨어지고 대응하기 어려움.
점층적 생성자 패턴(Telescoping Constructor pattern), 자바빈즈 패턴(JavaBeans Pattern) 을 사용할 수 있으나 사용성에 아래 제약이 따름.
public class TelescopingMember {
private final String name; // Requirement
private final String birth; // Requirement
private String bloodType;
private int height;
private String cellular;
public TelescopingMember( String name, String birth ) {
this.name = name;
this.birth = birth;
}
public TelescopingMember( String name, String birth, String bloodType ) {
this( name, birth );
this.bloodType = bloodType;
}
public TelescopingMember( String name, String birth, String bloodType, int height ) {
this( name, birth, bloodType );
this.height = height;
}
public TelescopingMember( String name, String birth, String bloodType, int height, String cellular ) {
this( name, birth, bloodType, height );
this.cellular = cellular;
}
}
public class JavaBeansMember {
private String name; // Requirement
private String birth; // Requirement
private String bloodType;
private int height;
private String cellular;
public JavaBeansMember() {
}
public void setName(String name) {
this.name = name;
}
public void setBirth(String birth) {
this.birth = birth;
}
public void setBloodType(String bloodType) {
this.bloodType = bloodType;
}
public void setHeight( int height ) {
this.height = height;
}
public void setCellular(String cellular) {
this.cellular = cellular;
}
}
객체의 불변성(Immutable)을 보장해야 하고, 직관적으로 이해할 수 있는 코드가 필요하면 아래가 대안이 될 수 있음.
public class BuilderMember {
private final String name; // Requirement
private final String birth; // Requirement
private final String bloodType;
private final int height;
private final String cellular;
private BuilderMember( Builder builder) {
this.name = builder.name;
this.birth = builder.birth;
this.bloodType = builder.bloodType;
this.height = builder.tall;
this.cellular = builder.cellular;
}
public static class Builder {
private final String name; // Requirement
private final String birth; // Requirement
private String bloodType;
private int tall;
private String cellular;
public Builder(String name, String birth) {
this.name = name;
this.birth = birth;
}
public Builder setBloodType(String bloodType) {
this.bloodType = bloodType;
return this;
}
public Builder setTall(int tall) {
this.tall = tall;
return this;
}
public Builder setCellular(String cellular) {
this.cellular = cellular;
return this;
}
public BuilderMember build() {
return new BuilderMember(this);
}
}
}
dependencies {
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.24'
annotationProcessor('org.projectlombok:lombok:1.18.24')
}
@Builder(builderMethodName = "Builder")
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
public class LMember {
@NonNull
private final String name; // Requirement
@NonNull
private final String birth; // Requirement
private final String bloodType;
private final int tall;
private final String cellular;
}