Я борюсь со следующим:
Проблема: process() возвращает тип и вызывается внутри вызова(), проблема в том, что процесс имеет входные параметры, которые не разрешают вызов(). Поэтому я сослался на этот вопрос: есть ли способ принять аргумент в вызываемом методе? , к сожалению, это не сработает для меня, поскольку мой объект, построенный через Spring, process() вызывается из JSP, а входные параметры являются переменными, в зависимости от действия пользователя.
Будет включать некоторый код для разъяснения, ниже:
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
}
}
Как я могу обойти это?
Короткий ответ, вы не можете. Контракт 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
s, вы могли бы дать ему фабричный метод:
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
}
process
так как этоpublic
метод?