実装は入力によって異なる必要があり、ある時点で入力を何らかのクラスに解決する必要があります。
そのマッピングを Guice で実行したい場合は、基本的にパラメーターに基づいた実装を取得します。これは、ここで回答したばかりの SO の質問にマップされます。入力を受け取り、完全に注入された実装を返す小さな注入可能なクラスを作成できます。
すでにそのマッピングがあり、(たとえば) 変数にクラス リテラルがある場合は、直接注入Injector
して実装を要求するだけです。
class YourClass {
@Inject Injector injector;
SomeInterface yourMethod(String input) {
Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
return injector.getInstance(clazz);
}
Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
// Implement this as needed.
return SomeInstance.class;
}
}
インジェクターはいつでも注入できますが、必要な実装の種類が本当にわからない場合にのみ行う必要があります (ここのように)。一般に、SomeInstance
それ自体を注入するかProvider<SomeInstance>
、作成を遅らせたい場合は a を注入する必要があります。