반응형
생성자나 정적 팩터리에 선택적 매개변수가 많을 때 대응하기가 어렵다.
매개변수가 많은 경우 어떤 식으로 개발자들은 처리했는지 다음을 봐보자.
1. 점층적 생성자 패턴
프로그래머들은 선택적 매개변수에 대응하는 방법으로 점층적 생성자 패턴을 이용하였다.
필수 매개변수만 받는 생성자
필수 매개변수 + 선택 매개변수 1개를 받는 생성자
필수 매개변수 + 선택 매개변수 2개를 받는 생성자
...
형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려 만드는 방식이다.
보통 이런 점층적 생성자 패턴 방법을 사용하면 사용자가 설정하길 원치 않는 매개변수까지 포함할 수 있는데, 어쩔 수 없이 그런 매개변수에도 값을 지정해줘야 한다. 때문에 매개변수 개수가 많아지면 클라이언트 코드의 가독성 및 작성이 어려워진다.
2. 자바빈즈 패턴
매개변수가 없는 생성자로 객체를 만든 후, 세터 메소드들을 호출해 원하는 매개변수의 값을 설정하는 방식
Student student = new Student();
student.setName("Kim");
student.setAge(25);
student.setEmail("dutmdcjf@gmail.com");
student.setGender("male");
- 객체 하나를 만들려면 메소드를 여러 개 호출해야 한다.
- 객체가 완전히 완성되기 전까지 일관성이 무너진 상태에 놓이게 된다.
- 클래스를 불변으로 만들 수 없다. 때문에 스레드 안전성을 얻으려면 프로그래머가 추가 작업을 해주어야 한다.
3. 빌더 패턴
점층적 생성자 패턴의 안전성
+
자바빈즈 패턴의 가독성
public class Student {
...
public static class Builder {
private String name = "";
private int age = 0;
private String email = "";
private String gender = "";
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public Builder gender(String gender) {
this.gender = gender;
return gender;
}
}
public Student build() {
return new Student(this);
}
private Student(Builder builder) {
name = builder.name;
age = builder.age;
email = builder.email;
gender = builder.gender;
}
}
//사용
Student student = new Student.Builder()
.name("Kim")
.age(25)
.email("dutmdcjf@gmail.com")
.gender("male")
.build();
반응형
'Reading Book > 이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] try-finally 보다 try-with-resources 사용하자 (0) | 2022.12.12 |
---|---|
[이펙티브 자바] 불필요한 객체 생성을 피하고, 다 쓴 객체 참조를 해제하자 (0) | 2022.12.11 |
[이펙티브 자바] 자원 직접 명시보다는 의존 객체 주입을 사용하기 (0) | 2022.12.11 |
[이펙티브 자바] private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.12.11 |
[이펙티브 자바] 생성자 대신 정적 팩터리 메소드를 고려하라 (0) | 2022.12.11 |