2016-12-19 3 views
2

私はクラスに注入されたオブジェクトのマップを格納するクラス内にフィールドを持っています。このフィールドに入力する方法は?guiceのstatic finalフィールド初期化のために依存関係注入フィールドを使用するには?

このフィールドは主にルックアップに使用されるため、静的な最終変数(Right?)になりますか?

例:

mapOfObjects.put("foo",x); 
mapOfObjects.put("bar",y); 

サンプルコード

public class A { 
    private ClassX x; 
    private ClassY y; 

    private final Map<String, Object> mapOfObjects = new HashMap<>(); 

    public void someMethod() { 
     Object obj = mapOfObjects.get("x"); 
     //do something fancy with obj 
    } 

    @Inject 
    public void setX(ClassX x) { 
     this.x = x; 
    } 

    @Inject 
    public void setY(ClassY y) { 
     this.y = y; 
    } 
} 
  1. は、静的なブロックにマップの構築を行うことができますか?この方法は醜いですか?
  2. 最初の依存性注入または静的なコードブロックはどうなりますか?
  3. このクラスもテスト可能であるように、最良の方法は何ですか。

ありがとうございます。

答えて

1

依存性注入を使用する場合は、マップが大きすぎないか、コンポーネントが必ずしもステートフルでない場合は、Guice Multibinidngsと静的でないフィールドを試してみてください。 com.google.inject.extensions:guice-multibindingsに余分な依存関係が必要です。これは、コアguiceの拡張で、マップとバインディングをサポートしているためです。

class SampleModule extends AbstractModule 
{ 
    @Override 
    protected void configure() 
    { 
     MapBinder<String, Object> templatesBinder = MapBinder.newMapBinder(
         binder(), 
         String.class, 
         Object.class, Names.named("MyBindings")); 

     templatesBinder.addBinding("A").toInstance(1); 
     templatesBinder.addBinding("B").toInstance("Hi!"); 
     templatesBinder.addBinding("B").toInstance(Boolean.FALSE); 
    } 
} 

次のようになります。あなたがマップを注入方法:ここで

は結合モジュール定義マップは次のようになり得るかであるあなたが非については本当に心配している場合

@Inject 
@Named("MyBindings") 
private Map<String, Object> cache; 

これの静的な性質は、シングルトンコンポーネントバインディングでマップをラップすることができます。

A1:はい、可能です。必ずしもそうではありません。

A2:静的なコードブロック。

A3:スタティックブロックではありません:-)マルチバインダはIMOでも構いません。 Guice、JUnit、Mockitoは一緒にとてもうまく動作します。

関連する問題