gpt4 book ai didi

java - 注入(inject)由枚举值键控的接口(interface)实现映射

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

我正在使用 Java 8 和 Play 框架。我的目标是注入(inject)一个映射,其键是枚举值,值是特定接口(interface)的实现。

这是我的枚举:

public enum Service {

HTML("html"), TEXT("txt");

private String serviceId;
Service(String serviceId) { this.serviceId = serviceId; }

}

我有Executable界面

public interface Executable { void execute(); }

以及两个实现它的类:

public class HtmlWorker implements Executable { ... } 
public class TextWorker implements Executable { ... }

我希望能够注入(inject)Map<Service, Executable> serviceMap所以我可以使用 Service 访问特定的实现关键:

public class Processor {

@Inject
Map<Service, Executable> serviceMap;

public void doStuff() {
Executable htmlService = this.serviceMap.get(Service.HTML);
Executable textService = this.serviceMap.get(Service.TEXT);
// do more stuff
}
}

我向模块类添加了绑定(bind):

public class AppModule extends AbstractModule {

@Override
protected void configure() {
MapBinder<Service, Executable> serviceBinder = MapBinder
.newMapBinder(binder(), Service.class, Executable.class);

serviceBinder.addBinding(Service.HtmlService).to(HtmlWorker.class);
serviceBinder.addBinding(Service.TextService).to(TextWorker.class);

}

问题是 serviceMap从未被注入(inject),并且始终是 null里面Processor 。我错过了什么?

最佳答案

据官方MapBinder文档中 MapBinder.addBinding 应采用 map 的键。

就您提供的示例而言,如何更改 AbstractModule 的代码:

serviceBinder.addBinding(Service.HtmlService).to(HtmlWorker.class);
serviceBinder.addBinding(Service.TextService).to(TextWorker.class);

serviceBinder.addBinding(Service.HTML).to(HtmlWorker.class); // <-- see the enum constant here?
serviceBinder.addBinding(Service.TEXT).to(TextWorker.class);

无论如何,我不知道您示例中的类 Service.HtmlService 来自哪里,因为您没有在任何地方声明它。

关于java - 注入(inject)由枚举值键控的接口(interface)实现映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60959768/

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