ITEM2. 생성자에 매개변수가 많다면 빌더 패턴을 고려하라
방법 1. 매개변수의 경우의 수만큼 생성자 만들기
public class Person {
private String name;
private int age;
private String address;
// 모든 매개변수를 받는 생성자
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
// 일부만 받는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this.name = name;
}
}
- 장점: 클래스 인스턴스를 생성할 때 단일 메소드 호출로 필요한 값들을 설정할 수 있다.
- 단점: 매개변수 조합이 많아질수록 생성자 오버로딩이 너무 많아져 가독성이 떨어지고, 유지보수가 어려워진다.
방법 2. set
메서드로 필요한 매개변수만 설정하기
public class Person {
private String name;
private int age;
private String address;
// 기본 생성자
public Person() {}
// setter 메서드
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
}
- 장점: 원하는 값만 선택적으로 설정할 수 있어 초기화가 유연하다.
- 단점: 객체를 만들고 여러
set
메서드를 호출해야 해서 코드가 길어진다. 또한, 객체가 완전히 초기화되지 않을 위험성이 있다.
방법 3. 빌더 패턴
public class Person {
private String name;
private int age;
private String address;
// private 생성자
private Person(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.address = builder.address;
}
// Builder 클래스
public static class Builder {
private String name;
private int age;
private String address;
public Builder setName(String name) {
this.name = name;
return this; // 빌더 객체를 반환
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public Person build() {
return new Person(this);
}
}
}
// 사용 예시
Person person = new Person.Builder()
.setName("Alice")
.setAge(30)
.setAddress("123 Main St")
.build();
- 장점:
- 가독성이 뛰어나고 코드가 간결하다.
- 객체를 불변으로 설계할 수 있다.
- 매개변수가 많을 때 적합하며, 선택적으로 설정할 수 있다.
- 단점: 클래스와 함께 추가적인
Builder
클래스가 필요해 코드가 약간 길어진다.
결론
빌더 패턴은 매개변수가 많거나 선택적으로 초기화해야 할 경우 가장 적합하다. 특히, 유지보수와 확장성이 중요할 때 유용하다. 반면, 간단한 클래스에는 생성자 방식이나 set
메서드를 사용하는 것이 더 효율적일 수 있다.
;