4

ほとんどの場合、ファクトリ メソッドを記述するとき、それはif成長し続けることができる一連の条件です。ifそのようなメソッドを (最小限の条件で)書く最も効果的な方法は何ですか?

public A createA(final String id) {
    if (id.equals("A1")) {
      return new A1();
    }
    else if (id.equals("A2")) {
      return new A2();
    }
    return null;
  }
4

3 に答える 3

12

を使用できますMap<String, Supplier<A>>

Map<String, Supplier<A>> map = new HashMap<>();
map.put("A1", () -> new A1());
map.put("A2", () -> new A2());

...

public A createA(final String id) {
    Supplier<A> supplier = map.get(id);
    if (supplier != null) {
        return supplier.get();
    }
    throw new IllegalArgumentException("unknown id: " + id);
}

これは、Java 8 ラムダ構文で標準の Java 8 Supplierインターフェイスを使用しますが、もちろん、独自の Supplier インターフェイスを定義し、匿名の内部クラスを使用してインスタンスを作成することもできます。

于 2014-04-17T06:44:54.540 に答える
1

私はアーキタイプ マップ アプローチが好きです。ある段階で、静的ブロックまたはクラス コンストラクターのいずれかでアーキタイプを埋めるだけです。コードは大体こんな感じ

  Map<String, A> archetypes;

  public A createA(final String id)
  {
     A a = archetypes.get(id);
     return (a!=null)?a.copy():null;
  }
于 2014-04-17T06:43:45.097 に答える
-1

このメソッドは遅延初期化です。の名前に対応するクラスがあると仮定しますid

public A createA(final String id) {
  // warning, should not use an id string that is tainted (eg from user input)
  return (A) Class.forName(id).newInstance();
}
于 2014-04-18T19:40:50.100 に答える