Можно ли реализовать шаблон стратегии с enum весной - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь реализовать шаблон стратегии с помощью Enum, но мне нужно, чтобы Service выполнял каждую из моих задач. Я попытался @AutoWired службы в Enum, но это не работает. Я немного искал "Как ввести боб в перечисление", и приходит ответ (но это выглядит не элегантно для меня).

Теперь я колеблюсь, чтобы продолжить, потому что я не знаю, хороший ли это путь. У нас есть дизайн теста для такого рода требований?

public enum TaskType {

    CREATE_MATERIAL{
        @Override
        public void handleTask(ScheduledEvent scheduledEvent) {
            service.createMaterial(scheduledEvent);
        }
    };


    @Autowired
    private static AService service;

    public abstract void handleTask(ScheduledEvent scheduledEvent);
}

1 Ответ

1 голос
/ 17 марта 2019

Вы не можете автоматически связать enum, так как перечисления являются константами, созданными средой выполнения Java, и не могут как таковые быть компонентами, управляемыми Spring.

Вам необходимо передать любые требуемые значения в качестве параметров дляметод.

public enum TaskType {

    CREATE_MATERIAL{
        @Override
        public void handleTask(AService service, ScheduledEvent scheduledEvent) {
            service.createMaterial(scheduledEvent);
        }
    };

    public abstract void handleTask(AService service, ScheduledEvent scheduledEvent);
}

Если для разных стратегий необходимо вызывать разные службы, прекратите использование enum.

public interface TaskType {
    public abstract void handleTask(AService service, ScheduledEvent scheduledEvent);
}

@Component
public class CreateMaterial implements TaskType {

    @Autowired
    private static AService service;

    @Override
    public void handleTask(ScheduledEvent scheduledEvent) {
        service.createMaterial(scheduledEvent);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...