3

mainメソッドを持たないクラスがあります。このクラスは、私の制御できないコードでも使用されます。このクラスには、文字列をパラメータとして受け取るメソッドがあり、その文字列の値に基づいて、さまざまなオブジェクトを作成する必要があります。Guiceを使用してこれらのオブジェクトを作成するにはどうすればよいですか?答えはプロバイダーと関係があると思いますが、それをどのように実装するかはわかりません。

これが問題のクラスで、DIを使用してオブジェクトを作成していません。

public class ActionHandler {

    public void doSomething(String message) throws Exception {

        ActionObject actionObj = null;

        if (message.equals("dog")) {
            // ActionObjectDog implements ActionObject
            actionObj = new ActionObjectDog(); 
        }
        else if (message.equals("cat")) {
            // ActionObjectCat implements ActionObject
            actionObj = new ActionObjectCat(); 
        }
        else {
            throw new Exception("Action " + message + " not implemented.");
        }

        actionObj.run();
    }
}

プロバイダーを注入しようとしましたが、プロバイダーのget()メソッドがActionObjectの特定の実装を返すようにする方法がわからなかったため、行き詰まりました。

@Inject private Provider<ActionObject> actionObjectProvider;

何かご意見は?

4

1 に答える 1

2

あなたが発見したように、パラメータをとらないProviderので、あなたの状況ではうまくいきません。get()

1つのオプションは、MapBinder:を使用することです。

class Module extends AbstractModule {
  @Override protected void configure() {
    MapBinder.newMapBinder(binder(), String.class, ActionObject.class)
        .addBinding("dog").to(ActionObjectDog.class);
    MapBinder.newMapBinder(binder(), String.class, ActionObject.class)
        .addBinding("cat").to(ActionObjectCat.class);
  }
}

class ActionHandler {
  private final Map<String, ActionObject> mappings;
  @Inject ActionHandler(Map<String, ActionObject> mappings) {
    this.mappings = mappings;
  }

  public void doSomething(String message) {
    Preconditions.checkNotNull(mappings.get(message), "No action for '" + message + "'")
        .run();
  }
}

それは素晴らしいギシネスを活用していませんが、ActionObject選択ロジックを外に移動ActionHandlerします。これは、あなたがやろうとしているように聞こえます。挿入されたマップは単なるであるCollections.UnmodifiableMapため、を呼び出すたびに同じインスタンスが返されます。mappings.get(...)つまり、ActionObject実装はスレッドセーフである必要があります。

また、方法の欠如に特別な注意が払われていることに私は混乱していmainます。おそらく私は問題を誤解していますが、Injector好きな場所からGuiceを作成できます。上記の解決策がうまくいかない場合は、その制限を拡張できますか?

于 2012-09-11T01:49:22.320 に答える