0

I am trying to implement a strategy pattern with Enum, but I need Service to handle each of my task. I tried to @Autowired a service into Enum but it doesn't work. I have searched a bit for "How to inject bean into enum" and there comes an answer(but it looks not elegant for me ).

I am now hesitate to continue because I don't know if this is a good way to go. Do we have batter design for this kind of requirement?

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

hsc
  • 1,226
  • 11
  • 24

1 Answers1

1

You can't autowire an enum, since enums are constants created by the Java runtime, and cannot as such be Spring-managed beans.

You need to pass in any required values as parameters to the method.

public enum TaskType {

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

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

If the different strategies need to call different services, stop using 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);
    }
};
Andreas
  • 154,647
  • 11
  • 152
  • 247