-
[Effective Java 2/E] 규칙2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라My-Book(History) 2016. 2. 20. 22:25
1.텔레스코핑 패턴Telescoping Constructor Pattern
- 필수 인자만 받는 생성자를 하나 정의하고, 선택적 인자를 받는 생성자를 추가하는패턴을 의미한다
ex)
public class Telescoping {
private String name;
private int age;
public Telescoping (String name, int age ) {
this.name = name;
this.age = age;
}
}
텔레스코핑 패턴은 잘 동작하지만 인자 수가 늘어나면 클라이언트 코드를 작성하기가 어려워지고 무엇보다 읽기 어려운 코드가 되고 만다.
2.자바빈 패턴
- 인자 없는 생성자를 호출하여 객체부터 만든 다음, setter 메소드 들을 호출하여 필수 필드뿐 아니라 선택적 필드의 값들까지 채우는것을 의미한다.
ex)
public class JavaBean {
private String name;
private int age;
public void SetName(String name) {
this.name = name;
}
public String getNme() {
return name;
}
public JavaBean(){}
}
1호의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체 일관성이 일시적으로 깨질 수 있다는 단점을 갖고 있다.
3.빌더 패턴
- 인자가 많은 생성자나 정적 팩터리가 필요한 클래스를 설계할 때, 특히 대부분의 인자가 선택적 인자인 상황에 유용하다.
ex) 선택적
public class NutrituionFacts {
private int servingSze'
private int servings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public static clas Builder {
// 필수 인자
private final int servingSize;
private final int servings;
//선택적 인자 - 기본값으로 초기화
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) { calories = val; return this;}
public Builder fat(int val) { fat = val; return this; }
public Builder carbohydrate(int val) { carbohydrate = val; return this; }
public Builder sodium(int val) { sodium = val; return this; }
public NutrituionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
carbohydrate = builder.carbohydrate ;
sodium = builder.sodium;
}
}
'My-Book(History)' 카테고리의 다른 글
[Effective Java 2/E] 규칙43 null 대신 빈 배열이나 컬렉션을 반환하라 (0) 2016.02.28 [Effective Java 2/E] 규칙42 varargs는 신중히 사용하라 (0) 2016.02.28 [리팩토링] 메소드 인수를 조절한다. (0) 2015.06.27 [리팩토링] 조건문 쪼개기 & 매개변수 (0) 2015.06.13 [리팩토링] 메서드 추출 (0) 2015.06.07