2012-09-13 11 views
3

빌더 인스턴스를 빌드 한 인스턴스 내에 저장하는 것이 좋습니다. 제가 이미 가지고있는 상황과 매우 비슷한 대상을 만들어야 할 상황에서 저는 종종 자신을 발견하게됩니다. 이 객체에는 많은 8-10 개의 필드가있을 것으로 추정됩니다. 일반적으로 변경할 수있는 객체를 사용하면 setter를 사용했을 것입니다. 나는 그것을 약간 수정 한변경 불가능한 오브젝트 빌더

public class NutritionFacts { 
    private final int servingSize; 
    private final int servings; 
    private final int calories; 
    private final int fat; 
    private final int sodium; 
    private final int carbohydrate; 

    private final Builder builder; 

    public static class Builder { 
     // Required parameters 
     private final int servingSize; 
     private final int servings; 
     // Optional parameters - initialized to default values 
     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 NutritionFacts build() { 
      return new NutritionFacts(this); 
     } 
    } 

    private NutritionFacts(Builder builder) { 
     servingSize = builder.servingSize; 
     servings = builder.servings; 
     calories = builder.calories; 
     fat = builder.fat; 
     sodium = builder.sodium; 
     carbohydrate = builder.carbohydrate; 
     this.builder = builder; 
    } 
} 

내가 미래에 simmiliar 복사본을 만들려면 내가 빌더 인스턴스에 액세스 할 수 있습니다

는 예를 들어, 고전 블로흐의 NutricionFacts 예를 취할 수 있습니다?

당신은 어떻게 생각하십니까?

+0

또는 복제 방법이있을 수 있습니다. –

+1

@dystroy 클래스가 변경 불가능하고 복제본이 수정 불가능한 첫 번째 인스턴스와 완전히 동일하므로 복제본은 좋은 옵션이 아닙니다. –

+1

ante의 대답은 아마도 올바른 길이며, 그렇다고해서 내장 클래스의 빌더에 대한 참조가 없어야합니다. 변경할 수없는 개체의 요점은 그것이 IMMUTABLE이라는 것입니다. 도달 가능한 변경 가능한 객체에 대한 참조를 가짐으로써 변경할 수없는 객체를 변경할 수 있다고 가정합니다. 두 스레드가 다른 빌더를 사용하기 시작하면 어떻게 될까요? 이전에 스레드로부터 안전하지 않은 불변 개체는 이제 스레드로부터 안전하지 않습니다. –

답변

5

Builder을 다시 사용하여 두 번째 인스턴스를 만드는 경우 어떻게됩니까? 첫 번째 인스턴스의 Builder은 두 번째 인스턴스와 비슷한 인스턴스를 생성합니다. 아마도 당신이 예상했던 것과 다를 것입니다.

나는 템플릿 인스턴스로 Builder을 만드는 옵션을 제안합니다.

public Builder(NutritionFacts template) { 
     this.servingSize = template.getServingSize(); 
     ... 
    } 
관련 문제