2014-05-13 27 views
0

我定義了一些「變形金剛」(函數)並需要它們的列表。他們每個人都得到由吉斯創造,我使用此代碼以獲取列表:如何從他們的類獲取Guice的對象列表?

public class CombinedTransformer extends AbstractTransformer { 
    @Inject CombinedTransformer(
      FirstTransformer firstTransformer, 
      SecondTransformer secondTransformer, 
      ThirdTransformer thirdTransformer) { 
     transformers = ImmutableList.of(
       firstTransformer, 
       secondTransformer, 
       thirdTransformer); 

我的列表很長,所以我不知道是否有一個更簡單的方法,像

public class CombinedTransformer extends AbstractTransformer { 
    @Inject CombinedTransformer(Injector injector) { 
     transformers = injector.getList(
      FirstTransformer.class, 
      SecondTransformer.class, 
      ThirdTransformer.class); 
    } 
} 

有沒有這樣的事情?

回答

1

您可以使用multibindings此:

Multibinder<AbstractTransformer> multibinder = Multibinder.newSetBinder(binder(), AbstractTransformer.class); 
multibinder.addBinding().to(FirstTransformer.class); 
multibinder.addBinding().to(SecondTransformer.class); 
multibinder.addBinding().to(ThirdsTransformer.class); 

然後你可以注入Set<AbstractTransformer>

@Inject 
CombinedTransformer(Set<AbstractTransformer> transformers) { 
    // do whatever you want with the set 
} 

但你不能在不直接使用multibindings做到這一點。如果你真的需要使用類的靜態已知列表對象的列表,你可以寫一個包裝器,注射器,並使用它:

public class ListInjectorWrapper { 
    private final Injector injector; 

    @Inject 
    ListInjectorWrapper(Injector injector) { 
     this.injector = injector; 
    } 

    @SafeVarargs 
    public final <T> List<T> getList(Class<? extends T>... classes) { 
     return Arrays.stream(classes).map(clazz -> injector.getInstance(clazz)) 
      .collect(Collectors.toList()); 
    } 
} 

然後注入並使用它,讓您的變壓器:

@Inject 
CombinedTransformer(ListInjectorWrapper injectorWrapper) { 
    transformers = injectorWrapper.getList(
     FirstTransformer.class, 
     SecondTransformer.class, 
     ThirdTransformer.class 
    ); 
} 
+0

我真的需要'List',因爲我正在做一個函數組合。但我想,我可以簡單地將其轉換爲[javadoc](http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html)中的「 *集合的迭代順序與綁定順序*「一致。無論如何,你的第二個解決方案適用於我。 – maaartinus

相關問題