У меня есть следующие классы:Весна - Динамическая фабрика, основанная на перечислении
public enum TaskType {
VERIFY_X_TASK, COMPUTE_Y_TASK, PROCESS_Z_TASK;
}
public interface Task{
void process();
}
@Component
public class VerifyXTask implements Task{
// Similar classes for the other types of tasks
public void process() {
}
}
@Component
public class TaskFactory{
private Map<TaskType, Task> tasks;
public Task getTask(TaskType type){
return tasks.get(type); // return a singleton with all it's fields injected by the application context
}
}
class UseTool{
@Autowired
private TaskFactory taskFactory;
public void run(String taskType){
Task task = taskFactory.getTask(TaskType.valueOf(taskType));
task.process();
}
}
Самый элегантный способ инъекционного ассоциации между TaskType и задачи на завод? Учтите, что существует почти 100 типов задач, и они могут изменяться довольно часто.
- Дальнейшие объяснения: я мог бы сделать в TaskFactory класса, как чего-л:
tasks.put(TaskType.VERIFY_X_TASK, new VerifyTask());
tasks.put(TaskType.COMPUTE_Y_TASK, new ComputeTask());
tasks.put(TaskType.PROCESS_Z_TASK, new ProcessTask());
Но это не инъекционные каких-либо свойств в объекте Task.
Не совсем понятно, что вы пытаетесь сделать; почему у вас есть «перечисление», это список операций, а затем нет каких-либо отношений между значениями «enum» и реализующими классами? – chrylis
Вопрос в том, как сопоставить эти отношения. Я мог бы сделать на фабрике smth like tasks.put (VERIFY_X_TASK, новый VerifyTask()); и т. д., но новый оператор не будет вводить зависимостей VerifyTasks. –