반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라.
빌더를 사용하기 전의 방법
1) 점층적 생성자 패턴
필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 필수 매개변수와 선택 매개변수 2개를 받는 생성자, ... 과 같이 매개변수를 달리하여 생성자 사용하는 방법.
→ 매개변수의 갯수가 많아지면 관리하기 어려워 진다. (가독성 저하, 매개변수의 갯수, 순서 실수 등)
public class Human{
private String name; // 필수값
private int age;
private String email;
// 생성자 1
public Human(String name){
this(name, 0, "");
}
// 생성자 2
public Human(String name, int age){
this(name, age, "");
}
// 생성자 3
public Human(String name, int age, String email){
this(name, age, email);
}
}
...
Human human1 = new Human("김멍목", 27, "secret@secret.com");
2) 자바빈즈 패턴(JavaBeans Pattern)
setter 함수를 이용하여 인스턴스를 생성하는 방법.
→ 객체 하나를 만들기 위해서는 메서드를 여러 개 호출
→ 객체가 완벽하게 생성되기 전까지는 일관성이 보장되지 않음
public class Human{
private String name; // 필수값
private int age;
private String email;
public Human(){
}
public void setName(String name){ this.name = name; }
public void setAge(int age){ this.age = age; }
public void setEmail(String email){ this.email = email; }
}
...
Human human1 = new Human();
human1.setName("김멍목");
human1.setAge(27);
human1.setEmail("secret@secret.com");
빌더 패턴(Builder Pattern)
- 점층적 생성자 패턴과 자바빈즈 패턴의 장점만을 사용.
- 필수 매개변수만으로 생성자를 호출해 Builder 객체를 얻은 후 Builder 객체 내부 메서드를 이용해서 선택 매개변수들을 설정 및 build메서드를 호출해 원하는 객체를 얻는 방법
(아래의 코드는 유효성 검사 코드는 생략)
public class Human{
private String name; // 필수값
private int age;
private String email;
public static class Builder {
// 필수 매개변수
private final String name;
// 선택 매개변수(기본값으로 초기화)
private int age = 0;
private String email = "";
public Builder(String name) {
this.name = name;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public Human build() {
return new Human(this);
}
}
private Human(Builder builder) {
name = builder.name;
age = builder.age;
email = builder.email;
}
}
...
Human human1 = new Human.Builder("김멍목").age(27).email("secret@secret.com").build();
정리
생성자 or 정적 팩터리 메서드에서 처리해야할 매개변수가 많다면 빌더 패턴을 고려하자.
빌더 패턴은 위에 소개된 2가지 방법보다 가독성이 좋고, 안전하다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2022.08.31 |
---|---|
[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라. (0) | 2022.08.31 |
[Effective Java] 아이템 1. 생성자 대신 정적 메서드 팩토리를 고려하라 (2) | 2022.08.29 |
[Spring Security] JSON 요청 시, 정상 작동하지 않는 오류 해결 (0) | 2022.07.05 |
[Java] Runnable Jar file로 export 시 목록에 없는 경우 (0) | 2022.05.28 |