ビルダー パターンを使用して 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 個まであるとしたら、それは単純なクラスであるべきものを長く巻き込み、散らかしてしまいます。
それが私が試したことです。より良い方法はありますか?