2

私は次のクラスを持っています:

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 と Task の間の関連付けをファクトリに挿入する最もエレガントな方法は何ですか? ほぼ 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 オブジェクトにプロパティを挿入しません。

4

2 に答える 2

3

次のアプローチをお勧めします。

  1. をパラメーターとして受け取るカスタム アノテーション@ImplementsTaskを定義して、次のTaskTypeように実装クラスを記述できるようにします。

    @Component
    @ImplementsTask(TaskType.VERIFY_X_TASK)
    public class VerifyXTask implements Task {
    ...
    

    (または、メタアノテーション@Componentを付けて、すべてのクラスで使用する必要がないようにすることもできます。)

  2. 特定されたすべてのTaskオブジェクトをファクトリに挿入します。

    @Autowired
    private Set<Task> scannedTasks;
    
  3. @PostConstructファクトリのメソッドで、 の各要素を反復処理しscannedTasks、注釈値を読み取り、Mapエントリを (EnumMapもちろん に) 追加します。特定の の重複した実装を処理する方法を決定する必要がありますTaskType

これには、ファクトリ セットアップでのリフレクション作業が少し必要になりますが、Task実装に適切な値で注釈を付けて、実装者による追加作業なしでスキャンインできることを意味します。

于 2013-10-03T09:28:22.450 に答える