줄 이 박사 돕 스는 기사 우리는 빌더를 서브 클래스의 경우를 처리 어떻게, 특히 빌더 패턴을? GMO 라벨링을 추가하기 위해 서브 클래스로 만들려는 예제의 컷 다운 버전을 취하면 다음과 같은 순진한 구현이 있습니다.
public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder() {}
public Builder calories(int val) { calories = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}
아강:
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder {
private boolean hasGMO = false;
public Builder() {}
public Builder GMO(boolean val) { hasGMO = val; return this; }
public GMOFacts build() { return new GMOFacts(this); }
}
protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}
이제 다음과 같은 코드를 작성할 수 있습니다.
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
그러나 주문이 잘못되면 모두 실패합니다.
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
물론 문제는 NutritionFacts.Buildera NutritionFacts.Builder가 아닌 을 반환 GMOFacts.Builder하므로이 문제를 어떻게 해결합니까? 사용하기에 더 나은 패턴이 있습니까?
참고 : 비슷한 질문에 대한이 답변 은 위의 수업을 제공합니다. 내 질문은 빌더 호출이 올바른 순서인지 확인하는 문제에 관한 것입니다.
build()은 어떻게 출력 b.GMO(true).calories(100)합니까?