我有一个ExecutorService
,用于处理任务流。这些任务由我的 DaemonTask 类表示,每个任务都会构建一个响应对象,该对象将传递给响应调用(超出了本问题的范围)。我使用 switch
语句根据任务 ID int
生成适当的任务。它看起来像;
//in my api listening thread
executorService.submit(DaemonTask.buildTask(int taskID));
<小时/>
//daemon task class
public abstract class DaemonTask implements Runnable {
public static DaemonTask buildTask(int taskID) {
switch(taskID) {
case TASK_A_ID: return new WiggleTask();
case TASK_B_ID: return new WobbleTask();
// ...very long list ...
case TASK_ZZZ_ID: return new WaggleTask();
}
}
public void run() {
respond(execute());
}
public abstract Response execute();
}
<小时/>
我的所有任务类(例如 WiggleTask()
)扩展 DaemonTask
并提供 execute()
方法的实现。
我的问题很简单;这种模式合理吗?当我看着我巨大的 switch case 及其所有 return 语句时,感觉有些不对劲。我试图以某种方式使用反射来提出一个更优雅的查找表解决方案,但似乎无法找出可行的方法。
最佳答案
你真的需要那么多课吗?每个taskId 可以有一个方法。
final ResponseHandler handler = ... // has many methods.
// use a map or array or enum to translate transIds into method names.
final Method method = handler.getClass().getMethod(taskArray[taskID]);
executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
method.invoke(handler);
}
});
如果你必须有很多类(class),你可以这样做
// use a map or array or enum to translate transIds into methods.
final Runnable runs = Class.forName(taskClassArray[taskID]).newInstance();
executorService.submit(new Callable<Void>() {
public Void call() throws Exception {
runs.run();
}
});
关于Java ExecutorService 任务生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14141467/