2

ビルダー パターンを使用して JavaBean (フィールドとゲッター/セッターのみ) を構築しています。

この例のために、これが私たちの Bean であると仮定します。

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

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.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);
    }
  }
}

ここから撮影。

今、私はすべてのフィールドPizzaがnullではないことを確認しようとしてきました.リフレクションを使用して、フィールドを繰り返し処理し、Pizzaそれらがnullではないことを確認していますが、私のフィールドがチェックが発生する前に設定されません。Jon Skeet によるこのコードは、フィールドが null でないことを確認するために変更したものです (カウントする代わりに、例外をスローしています)。

次に、代わりにビルダーのフィールドをチェックしようとしましたが、ビルダーに余分なフィールドがあります (たとえば、null の可能性がある XMLParser フィールドがあります)。ビルダー フィールドをピザ フィールドでサブセット化しても、「パッケージ パス」が異なる (?) ため、機能しません。org.GiusepesPizzaria.pizza.size org.GiusepesPizzaria.builder.size

これを確認するより良い方法はありますか?リフレクション メソッドを実装する前に、次のような構造を使用しました。

if(builder.size ==null){
    throw new BadPizzaException("Eh, what're ya doin'?"+
             " Pizza Size was not set correctly");
}else{
    size=builder.size;
}

しかし、チェックするフィールドが 10 個まであるとしたら、それは単純なクラスであるべきものを長く巻き込み、散らかしてしまいます。

それが私が試したことです。より良い方法はありますか?

4

2 に答える 2

2

すべての変数が確実に設定されるようにするための興味深いパターンは、Step Builder パターンを使用することです。このパターンでは、最初のセッターでは 2 番目の設定のみが許可され、2 番目のセッターでは 3 番目の設定のみが許可されます。最後のステップでクラスを作成すると、すべてのメソッドが呼び出されたことがわかります。

その投稿からの短い抜粋:

Panino solePanino = PaninoStepBuilder.newBuilder()
        .paninoCalled("sole panino")
        .breadType("baguette")
        .fish("sole")
        .addVegetable("tomato")
        .addVegetable("lettece")
        .noMoreVegetablesPlease()
        .build();

パニーノと呼ばれるものから始めて、パンの種類でフォローアップする必要がある場所.

于 2013-05-15T17:55:51.730 に答える