4

ビルドしたインスタンス内にビルダーインスタンスを保存することは良い習慣と見なされますか?問題は、私がすでに持っているものと非常に類似したオブジェクトを作成する必要がある状況に自分自身を見つけることがよくあるということです。おそらく、このオブジェクトには多くの8〜10個のフィールドがあります。通常、可変オブジェクトでは、setterを使用します。

たとえば、古典的なBlochのNutricionFacts例を見てみましょう。

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;
    }
}

将来、類似したコピーを作成したい場合にビルダーインスタンスにアクセスできるように、少し変更しましたか?

どう思いますか?

4

1 に答える 1

6

Builderを再利用して2番目のインスタンスを構築するとどうなりますか?最初のインスタンスのBuilderは、2番目のインスタンスと同様のインスタンスを生成します。おそらくあなたが期待したものではありません。

Builderテンプレートインスタンスを使用してを作成するオプションをお勧めします。

    public Builder(NutritionFacts template) {
        this.servingSize = template.getServingSize();
        ...
    }
于 2012-09-13T11:55:36.897 に答える