2016-12-19 33 views
2

我在一個類中存儲了一個字段,它存儲了注入類中的對象的映射。如何填充此字段?如何在guice中使用依賴注入字段進行靜態最終字段初始化?

此字段主要用於查找,因此有資格成爲靜態最終變量(右?)?

例子:

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一起工作得很好。