0

内部に静的クラスを含むビルダーを使用する必要があるのはいつですか?

効果的な Java ブックからの実装

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

定期実施

(ただの図) ここに画像の説明を入力

4

2 に答える 2

2

1.オブジェクトが矛盾した状態になるのを防ぐ必要がある場合、および 2.コンストラクター パラメーターを使用すると、手に負えない (多数の) 必要なプロパティがあるため、使用/読み取りが困難になる場合は、Builder パターンの使用を検討する必要があります。設定。

通常のデフォルト コンストラクター + ゲッター/セッターを使用すると、コンシューマーが無効/矛盾した状態になる可能性があります。IE 非常に重要なプロパティ (Cheese など) の設定を忘れる可能性がありますが、そうすることが妨げられることはなく、「悪い」状態であってもピザを作成できます。構築後にオブジェクトの状態を適切に設定するのは消費者の負担です。

通常、コンストラクターのパラメーターを使用してこれを防ぐことができます。例えば

private Pizza() {}
public Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) 
{
    ...
}

ただし、多数のパラメーターがある場合、これは読み取り/書き込みが困難になる可能性があります。

つまり、要約すると、オブジェクトが一貫性のない状態で構築できないことを保証したい場合、および設定するフィールドが多すぎてコンストラクターパラメーターを使用すると使用と読み取りが困難になる場合は、ビルダーパターンの使用を検討できます。 .

于 2013-09-13T04:33:52.293 に答える
1

クラスコンストラクターを自然に見せるためにさらに一歩進んだ準備ができたら、私は言います。

これが良いコードのように見えることを誰が否定できますか?

Pizza pizza = new Pizza.Builder(10).cheese(true).peperoni(true).bacon(true).build();

というか…ただ甘いだけじゃない?ベーコンも入ってます!

2番目の(そしてより一般的な)オプションは次のとおりです。

Pizza pizza = new Pizza(10);
pizza.setCheese(true);
pizza.setPeperoni(true);
pizza.setBacon(true);

これは、リフレクションを使用する方が簡単であり、したがって、シリアル化/逆シリアル化がはるかに簡単になりますが、より面倒で冗長な構造に悩まされます。

3番目で最も柔軟性の低いものは次のとおりです。

Pizza pizza = new Pizza(10, true, true, true);

しかし、2番目と3番目のメカニズムの両方を一緒に提供することが可能であり、プラスになる可能性があります.

選び方

選択する簡単な方法はありません。顧客にライブラリを購入してもらいたい場合は、3 つの方法すべてを提供できますが、それでは Builder を使用する主な利点の 1 つ (実際のコンストラクターが隠されている) が台無しになります。

Builder を使用するという通常とは異なる方法を使用する正当な理由がない限り、2 番目の方法とおそらく 3 番目の方法を使用することをお勧めします。

于 2013-09-09T22:34:16.817 に答える