Вставить карту реализаций интерфейса, основанных на значениях Enum - PullRequest
0 голосов
/ 31 марта 2020

Я использую Java 8 с платформой Play. Моя цель состоит в том, чтобы внедрить карту, ключами которой являются перечисляемые значения, а значения являются реализациями определенного c интерфейса.

Вот мое перечисление:

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 { ... }

Я хотел бы иметь возможность внедрить Map<Service, Executable> serviceMap, чтобы иметь доступ к конкретной реализации c с помощью ключа 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
  }
}

Я добавил привязки к классу модуля:

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 никогда не вводится и всегда null внутри Processor. Чего мне не хватает?

...