我正在努力解决以下问题:
问题: process()返回一个Type并在call()内部调用,问题是该进程有call()签名不允许的输入参数。所以我提到了这个问题:Is there a way to take an argument in a callable method?,遗憾的是,由于我的对象是通过Spring构建的,因此我无法为我工作,从JSP调用process()并且输入参数是可变的,具体取决于用户操作
将包含一些代码以供澄清,如下:
public class MyClass implements MyClassInterface, Callable<Results> {
private String fileLocation;
private final SMTPMailer smtpMalier;
public MyClass(String fileLocation, SMTPMailer smtpMalier) {
this.fileLocation = fileLocation;
this.smtpMalier = smtpMalier;
}
public Results call() {
// to return process(arg1, arg2) here, need to cater for input parameters
}
public Results process(String arg1, String arg2) {
// does some proceeding, returns Results
}
public void shutdown() {
// shut down implementation
}
}
我该如何解决这个问题?
答案 0 :(得分:2)
简短的回答是,你不能。
Callable
的合同是它可以在没有任何输入的情况下执行操作。
如果需要参数,则不是Callable
。
您需要考虑如何调用代码。我假设你有这样的代码:
AsyncTaskExecutor executor = ...;
MyClass theService = ...;
String foo = "apple", bar = "banana";
Future<Results> result = executor.submit(theService); // Needs foo and bar :(
简单的解决方案是,不要在Callable
中实施MyClass
。 不能可调,它需要一些输入参数!实现Callable
代替它,例如你拥有所有参数:
AsyncTaskExecutor executor = ...;
MyClass theService = ...;
String foo = "apple", bar = "banana";
Future<Results> result = executor.submit(new Callable<Results>(){
@Override public Results call(){
return theService.process(foo, bar);
}
});
// Or if you're on Java 8:
Future<Results> result = executor.submit(() -> theService.process(foo, bar);
如果这种情况发生了很多,并且你真的真的希望课程为你提供Callable
,你可以给它一个工厂方法:
public class MyClass implements MyClassInterface {
public Results process(String arg1, String arg2) {
// does some proceeding, returns Results
}
public Callable<Results> bind(String arg1, String arg2) {
return () -> process(arg1, arg2);
}
// Other methods omitted
}