我正在研究一个我们有任务概念的框架。希望很多人会编写任务,为此他们只需要实现 Task 接口。任务需要通过它们的名称来触发,这意味着某处需要有一个任务名称->任务类的中央注册表。目前我正在使用 Enum 来执行此操作,但这需要任务实现者为他们实现的每个任务将代码添加到 Enum 中,这很糟糕。
我想出的另一个选择是通过反射搜索所有实现 Task 接口的类并从那里注册它们。这也让我感到恶心,我觉得必须有更好的方法。
如果静态初始化程序不需要在运行之前至少引用一次类,那么它会是完美的。
注释是另一种选择,但它们需要更多的反射工作,或者如果我们要进行编译时代码生成来创建调度程序,则需要更改构建过程。
有更简单的想法吗?
下面是我现在正在做的一个简单版本,以了解我想要的控制流(为简单起见,将其拆分为一个类):
class Disp {
interface Task {
public String doTask();
}
static class HelloTask implements Task {
public String doTask() {
return "Hello";
}
}
static class ByeTask implements Task {
public String doTask() {
return "Bye";
}
}
static class TaskDispatcher {
static enum Tasks {
Hello {
Task getTask() {
return new HelloTask();
}
},
Bye {
Task getTask() {
return new ByeTask();
}
};
abstract Task getTask();
};
public static Task getTask(String taskName) {
return Tasks.valueOf(taskName).getTask();
}
}
public static void main(String[] args) {
System.out.println("Hello task says: "+TaskDispatcher.getTask("Hello").doTask());
System.out.println("Bye task says: "+TaskDispatcher.getTask("Bye").doTask());
}
}
如果注册(比如说)HelloTask 的代码只能存在于 HelloTask 中,而不必泄漏到 TaskDispatcher 中(在实际项目中,这些是多个不同的文件),那就更好了