我有以下课程
Class Results {
ResultA resultA;
ResultB resultB;
ResultC resultC;
}
ResultA, ResultB, ResultC
的类型不同,不能适合一个类层次结构。
我有一个DAO与db对话以获得上述结果
Class ResultDAO {
ResultA getResultA(/*takes non-zero argument list*/) {
}
ResultB getResultB(/*takes non-zero argument list*/) {
}
ResultC getResultC(/*takes non-zero argument list*/) {
}
}
我需要通过调用DAO方法获得三个结果resultA, resultB, resultC
。这需要同时发生。我使用了一个执行程序服务,并通过以下方式在不同的匿名callables中调用上述三种方法。虽然没有返回类型,但是在runnables上使用callables的原因是因为ResultDAO
抛出了已检查的异常而Runnable
没有传播已检查的异常而Callable
会这样做。
Result getResult() {
List<Callable<Void>> tasks = new ArrayList<>();
Results results = new Results();
tasks.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
results.setResultA(resultDAO.getResultA(/*non-zero params*/));
return null;
}
});
tasks.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
results.setResultB(resultDAO.getResultB(/*non-zero params*/));
return null;
}
});
tasks.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
results.setResultC(resultDAO.getResultC(/*non-zero params*/));
return null;
}
});
List<Future<Void>> futures = executorService.invokeAll(tasks);
for(Future<Void> future: futures) {
future.get();
/*removing the exception handling part of future.get() for brevity*/
}
return result;
}
上述实现显然不是很好并且代表代码味道。要进一步修改,编写测试和维护代码并不容易和直接。为简单起见,我在问题中只包含了3种结果类型。但实际实施中还有更多内容,这就是为什么它难以管理代码
我无法找到上述问题的最佳做法。任何人都可以建议更好的实施吗?