필수 매개변수로만 이뤄진 생성자부터 필수요소가 아닌 매개변수들을 하나씩 추가한 생성자까지 인자를 늘려가며 모든 인자를 받는 생성자까지 정의하는 방법
package ConstPattern;
// 점층적 생성자 패턴 ver
public class Member1 {
// 필수요소
private final String name;
private final int age;
// 선택요소
private final String tell;
private final String birth;
public Member1(String name, int age) {
// 1) 필수 요소만 있는 경우
this(name, age, "no tell", "no birth");
}
public Member1(String name, int age, String tell) {
// 2) 필수 요소와 선택적 요소 1개만 있는 경우
this(name, age, tell, "no birth");
}
public Member1(String name, int age, String tell, String birth) {
// 모두 있는 경우
this.name = name;
this.age = age;
this.tell = tell;
this.birth = birth;
}
}
Member1 m1 = new Member1("juran", 24, "01000000000");
선택 요소가 자주 빠지는 경우 new 키워드와 생성자를 통해 객체를 쉽게 생성할 수 있다.
하지만 생성자를 호출하는 코드가 많아져 인자가 추가될 때마다 코드 수정이 어렵고 코드 가독성이 떨어진다.
매개변수가 없는 생성자로 객체 생성 후 setter를 통해 요소의 값 설정하는 방법
package ConstPattern;
// 자바빈즈 패턴 ver
public class Member2 {
// 필수요소
private String name;
private int age;
// 선택요소
private String tell;
private String birth;
// 기본 생성자
public Member2() {}
// setter
public void setName(String name) {this.name = name;}
public void setAge(int age) {this.age = age;}
public void setTell(String tell) {this.tell = tell;}
public void setBirth(String birth) {this.birth = birth;}
}
어노테이션 ver
@Setter
@NoArgsConstructor
public class Member2() {
private String name;
private int age;
private String tell;
private String birth;
}
@Setter 각 멤버변수에 대한 setter 생성
@NoArgsConstructor 매개변수가 없는 기본 생성자
Member2 m2 = new Member2();
m2.setName("juran");
m2.setAge(24);
m2.setTell("01000000000");
m2.setBirth("0422");
가독성이 좋으나 하나의 인스턴스 생성을 위해 호출되는 메서드가 많다.
setter 메서드가 있기 때문에 불변 객체를 생성할 수 없다.
별도의 Builder 클래스를 만들어 필수 값에 대해서는 빌더 생성자를 통해, 선택적인 값들에 대해서는 입력받은 후 builder 메서드를 통해 하나의 인스턴스를 리턴하는 방식
* 객체내에는 setter와 public이 없기 때문에 빌더 클래스를 통해서만 값에 접근 가능
직접 빌더 코드 작성
package ConstPattern;
// 빌더 패턴 ver
public class Member3 {
private final String name;
private final int age;
private String tell;
private String birth;
private Member3(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.tell = builder.tell;
this.birth = builder.birth;
}
public static class Builder {
// 필수요소
private final String name;
private final int age;
// 선택요소
private String tell;
private String birth;
// 필수 인자만 있는 빌더
public Builder(String name, int age) {
this.name = name;
this.age = age;
}
// 선택 인자
public Builder tell(String tell) {
this.tell = tell;
return this;
}
public Builder birth(String birth) {
this.birth = birth;
return this;
}
// 인스턴스 반환
public Member3 build() {
return new Member3(this);
}
}
}
어노테이션 ver
@Builder
public class Member3 {
private final String name;
private final int age;
private final String tell;
private final String birth;
}
@Builder 빌더 자동생성하여 코드 단축 가능
Member3 m = new Member3.Builder("juran", 24)
.birth("0422")
.build();
코드 가독성이 좋고 setter가 없어 변경이 불가능해져 객체의 일관성이 보장된다.
빌더 클래스를 따로 생성해줘야 한다.
[SPRING] 스프링 핵심 원리 고급편 | 프로젝트 생성과 로그 추적기 (0) | 2021.11.15 |
---|---|
[JAVA] 자바 자료형, Integer와 int의 차이에 대해 (0) | 2021.08.26 |
[SPRING] Querydsl | 스프링 데이터 JPA로 페이징하기 (0) | 2021.05.18 |
[SPRING] Querydsl | 스프링 데이터 JPA와 Querydsl (0) | 2021.05.17 |
[SPRING] Querydsl | 벌크 연산 (0) | 2021.05.17 |
댓글 영역