在春天可以用枚举实现策略模式吗

时间:2019-03-17 05:57:03

标签: java spring spring-boot enums

我正在尝试使用Enum实现策略模式,但是我需要Service来处理我的每项任务。我试图将服务自动添加到Enum中,但它不起作用。 我搜索了一下“如何将豆子注入到枚举中”,然后出现了answer(但对我来说看起来并不优雅)。

我现在不愿意继续,因为我不知道这是否是一个好方法。我们是否有针对这种要求的面糊设计?

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 个答案:

答案 0 :(得分:1)

您不能自动连接enum,因为枚举是Java运行时创建的常量,因此不能是Spring管理的bean。

您需要将任何必需的值作为参数传递给方法。

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);
    }
};