新しいクラス、Holder を実装しました。目標は次のとおりです。
- 3 つのフィールド。フィールド 1 と 2 は int で、フィールド 3 はブール値です。
- 一度構築されると、変更されません (不変)。したがって、フィールドにはゲッターのみがあります。
- フィールド 1 と 2 は、文字列形式 1、文字列形式 2、int、クラス タイプ A、クラス タイプ B の 5 つの可能なタイプから情報を抽出することによって初期化されます。フィールド 3 は true / false として設定されます。
これが私に残す問題は、可能なコンストラクターオプションが 50 あることです。5 X 5 X 2. これは賢明でもスケーラブルでもありません (6 番目のタイプを追加すると、大幅な変更を行う必要があります)。そのため、ビルダー パターンを使用しました。
class Builder {
Builder s1SetField1(String Format1),
Builder s2SetField1(String Format2),
...
Builder s1SetField2(String Format1),
...
Builder setField3(boolean b)
Holder build()
}
これは本当にうまくいきます。フィールド 1 の初期化用に 5 つのビルダー メソッド、フィールド 2 の初期化用に 5 つのビルダー メソッド、ブール値用に 1 つのビルダー メソッドがあります。フィールドが設定されたら、正しい形式のフィールドでプライベート コンストラクターを呼び出す build() メソッドを呼び出し、新しいオブジェクトを返します。
私が抱えている問題は単体テストです。Builder メソッドのすべての順列で構築された代表的なオブジェクトが取り込まれたリストを設定したいと思います。これで、50 の新しい Build() 呼び出しに戻りました。field1List、field2List、field3List の 3 つのリストを作成することを考えました。次に、それぞれを階層的に繰り返します。
for (Object f1 : field1List) {
for (Object f2 : field2List) {
for (boolean f3 : field3List) {
returnList.add(new Builder().setField1(f1).setField2(f2).setField3(f3).build());
}
}
}
return returnList;
もちろん、混合オブジェクトをリストに保持するのは扱いにくいように思えます。すべての順列を使用して初期化するより良い方法はありますか?