일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 스프링 시큐리티 설정
- spring formatter
- java predicate
- 자바 필터
- open-session-in-view
- 스프링부트 도커
- 기능적 요구사항
- ioc컨테이너
- 스프링 포매터
- kotlin 리팩터링
- Atomicity
- 스프링시큐리티
- 비기능적 요구사항
- 스프링
- 생성자주입
- 정적팩토리메서드
- method refetence
- kotlin ::
- IOC
- 소프트웨어의 품격
- 도커 이미지 빌드
- 토비의 스프링
- Spring
- jpa no session
- fetch join
- 동적파라미터
- 그래프큐엘
- 수정자주입
- 스프링di
- jpa lazy
Archives
- Today
- Total
공부기록
아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 본문
반응형
생성자에 매개변수가 많다면 빌더를 고려하라
정적팩터리와 생성자의 문제?
선택적 매개변수가 많을 때 적절히 대응하기 어렵다.
문제해결하기
- 점층적 생성자 패턴
- 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자 ... 이런 식으로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식.
- 매개변수가 많아지면 코드를 작성하거나 읽기 어렵다.
public class Solution {
private int a,b,c,d;
Solution() {
this(0,0,0,0);
}
Solution(int a) {
this(a,0,0,0);
}
Solution(int a, int b) {
this(a,b,0,0);
}
...
}
- 자바빈즈패턴
- 매개변수 없는 생성자로 객체를 만든 뒤 세터 메서드들로 각 값을 설정하는 것.
- 객체 하나를 완성시키려면 메서드를 여러개 호출해야한다.
- 객체가 완전히 생성되기 전까지 일관성(Consistency)이 무너진 상태가 된다.
- 일관성이 무너지는 문제때문에 불변으로 만들 수 없다.
public class Solution {
private int a,b,c,d;
Solution() {}
public void setA(int a) {
this.a = a;
}
...
}
- 빌더패턴
- 순서
- 필수 매개변수만으로 생성자(혹은 정적 팩터리)를 호출해 빌더객체를 얻는다.
- 빌더객체가 제공하는 일종의 세터메서들로 값을 설정한다.
- 마지막으로 매개변수가 없는
build
메서드를 호출해서 완성된 객체를 얻는다.
- 순서
public class Solution {
private int a,b,c,d;
public static class Builder {
//필수매개변수
private int a;
//선택매개변수
private int b = 0;
private int c = 0;
private int d = 0;
Builder(int a) { this.a = a; }
Builder b(int b) {
this.b = b;
return this;
}
Builder c(int c) {
this.c = c;
return this;
}
Builder d(int d) {
this.d = d;
return this;
}
Solution build() {
return new Solution(this);
}
}
private Solution(Builder builder) {
this.a = builder.a;
this.b = builder.b;
this.c = builder.c;
this.d = builder.d;
}
...
}
정리
- 생성자나 정적 팩터리가 처리해야할 매개변수가 많다면 빌더패턴을 선택하는 게 낫다.
- 코드가 장황하고, 객체를 만들기 앞서 빌더 객체를 만들어야한다는 단점이 있지만, API는 시간이 지날 수록 매개변수가 많아지는 경향이 있음을 명심할 것. 애초에 빌더패턴으로 시작하는 편이 나을 때가 많다.
반응형
'JAVA' 카테고리의 다른 글
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라. (0) | 2019.11.26 |
---|---|
아이템3. private생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2019.11.26 |
아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라. (2) | 2019.11.26 |
1022 템플릿메서드 (0) | 2019.10.22 |
[JUnit5] gradle에 junit5 끼얹기 (0) | 2019.08.11 |