gpt4 book ai didi

java - 如何从 Guice 中按类获取对象列表?

转载 作者:行者123 更新时间:2023-12-01 12:59:35 25 4
gpt4 key购买 nike

我定义了一些“转换器”(函数)并且需要它们的列表。它们中的每一个都是由 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);
}
}

有这样的事情吗?

最佳答案

您可以使用multibindings为此:

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

然后就可以注入(inject)Set<AbstractTransformer> :

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

但是如果不直接使用多重绑定(bind)就无法做到这一点。如果您确实需要使用静态已知的类列表来获取对象列表,您可以在注入(inject)器周围编写一个包装器并使用它:

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)它并使用它来获取你的变压器:

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

关于java - 如何从 Guice 中按类获取对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com