我的情况如下,我有一堆命令,例如:
someService1.foo()
someService2.bar()
需要以两种不同的方式执行,一种是在修改后的安全上下文中执行的,有些时候是在不修改安全上下文的情况下执行的。现在我的计划是编写一个Executor,其结构应如下所示:
public Object runCommand(Runnable command){
if(someCondition){
//run command in modified context
} else {
//just run the command
}
}
我的主要问题是如何将命令的返回值返回给调用方法。因为Runnable的run()的返回类型为void。所以我考虑过使用Callable来实现这一目标。但是,是否有解决此问题的通用方法?
答案 0 :(得分:1)
好吧,您可以创建自己的接口(Runnable也是接口),而不是使用Runnable。如果您希望返回类型是通用的,则可以创建类似以下内容的
@FunctionalInterface
interface MyCommand<T> {
public T execute();
}
然后您的代码将变为:
public <T> T runCommand(MyCommand<T> command){
if(someCondition){
//Run it in context or whatever
return command.execute();
} else {
return command.execute();
}
}
您可以像使用它一样(此处有完整代码):
public class Test{
public static void main(String[] args) {
Test test=new Test();
String result1=test.runCommand(test::stringCommand);
Integer result2=test.runCommand(test::integerCommand);
Boolean result3 = inter.runCommand(new MyCommand<Boolean>() {
@Override
public Boolean execute() {
return true;
}
});
}
public String stringCommand() {
return "A string command";
}
public Integer integerCommand() {
return new Integer(5);
}
public <T>T runCommand(MyCommand<T> command){
return command.execute();
}
}