我正在使用 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/