gpt4 book ai didi

java - Callable call() + 输入参数 + Spring

转载 作者:行者123 更新时间:2023-11-30 03:30:10 24 4
gpt4 key购买 nike

我正在努力解决以下问题:

  1. 该类是通过Spring构建的
  2. 它实现了由两个方法(process、shutdown)组成的接口(interface)
  3. 它还实现了 Callable

问题:process() 返回一个 Type,并在 call() 内部调用它,问题是 process 有 call() 签名不允许的输入参数。所以我提到了这个问题:Is there a way to take an argument in a callable method?不幸的是,这对我来说不起作用,因为我的对象是通过 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 :(

简单的解决方案是,不要在 MyClass 中实现 Callable。它不可调用,它需要一些输入参数!在有意义的地方实现 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
}

关于java - Callable<T> call() + 输入参数 + Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com