728x90
반응형
if. 생성자의 매개변수가 많다면 ❓
public class User {
private long userSn;
private String userId;
private String userPw;
public User(long userSn) {
this.userSn = userSn;
}
public User(long userSn, String userId) {
this.userSn = userSn;
this.userId = userId;
}
public User(long userSn, String userId, String userPw) {
this.userSn = userSn;
this.userId = userId;
this.userPw = userPw;
}
}
- 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.
대안 ❗
1️⃣ 자바빈즈 패턴
public class User {
private long userSn;
private String userId;
private String userPw;
public void setUserSn(long userSn) {
this.userSn = userSn;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setUserPw(String userPw) {
this.userPw = userPw;
}
}
- 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.
2️⃣ 빌더 패턴
public class User {
private long userSn;
private String userId;
private String userPw;
public User(Builder builder){
this.userSn = builder.userSn;
this.userId = builder.userId;
this.userPw = builder.userPw;
}
public static class Builder {
public long userSn;
public String userId;
public String userPw;
private Builder() {
}
public Builder with(Consumer<Builder> consumer){
consumer.accept(this);
return this;
}
public User build(){
return new User(this);
}
}
}
- 빌더는 점층적 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고, 자바빈즈보다 훨신 안전하다.
참고 자료
Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, 프로그래밍인사이트(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=
728x90
반응형
'Java' 카테고리의 다른 글
[Effective Java] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2022.05.24 |
---|---|
[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. (0) | 2022.05.24 |
[Effective Java] 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라. (0) | 2022.05.24 |
[Java] Comparator 와 Comparable (0) | 2021.01.23 |
[Java] 컬렉션 프레임워크 (0) | 2021.01.23 |