Java 如何从一个方法返回不同数据类型的多个值?

Java 如何从一个方法返回不同数据类型的多个值?,java,Java,我有下面的方法, public Response process(Applicant appl) { String responseString; String requestString; requestString = createRequestString(appl); responseString = sendRequest(requestString); Response response = parseResponse(responseStr

我有下面的方法,

public Response process(Applicant appl)
{

    String responseString;
    String requestString;
    requestString = createRequestString(appl);
    responseString = sendRequest(requestString);
    Response response = parseResponse(responseString);
    return response;
}

这里我想返回responseString和response,一个是String类型,另一个是response类的对象。如何执行此操作?

您可以创建一个自定义类型,其中包含这两个值

public class ResponseObject {
    private String responseString;

    private Response response;

    //accessors
}
然后返回该类的一个实例作为结果。

不,您不能

只能返回方法签名中提到的类型

你能做的是

Response
类中创建一个名为
responseString
的字段,并添加
setters
getter

public Response process(Applicant appl)
{

    String responseString;
    String requestString;
    requestString = createRequestString(appl);
    responseString = sendRequest(requestString);
    Response response = parseResponse(responseString);
    response.setResponseString(responseString);
    return response;
}

如果两个对象都是单独的实体,则首选的方法是:


您需要为此创建一个包装器类。与其他一些语言不同,Java语言不支持自动解包的元组返回值。只需创建如下数据类:

class ResponseData {
    public final String responseString;
    public final Response response;

    public ResponseData(String responseString, Response response) {
        this.responseString = responseString;
        this.response = response;
    }
}

可以按如下方式返回对象数组:

public Object[] process(Applicant appl)
{
...
但您需要跟踪插入对象的索引(字符串、响应)


另一种方法是,您可以返回具有表示值的键的
Map

Java方法由其签名决定。一个作用域中只能存在一个唯一签名

public class ResponseObject {
    private String responseString;

    private Response response;

    //accessors
}
方法签名:方法声明的两个组件包括方法签名、方法名称和参数 类型

正如描述中所建议的,返回类型不在签名中,因此不可能有两个只因返回类型不同而不同的方法

但是,有几种方法可以返回不同的对象类型

对象类型

返回
对象
类型,因为所有类都是
对象
的类型,然后将其强制转换为适当的类型

public Object process(Applicant appl);
继承

定义基类并从基类派生
Response
ResponseString

class ResponseBase
{

}
并导出您的类

class Response extends ResponseBase{...}
class ResponseString ResponseBase{...}
并从方法中返回基类

public ResponseWrapper process(Applicant appl);
公共响应基础流程(申请人申请)

作文

将您的
响应
响应字符串
包装到包装器类并返回它

class ResponseWrapper
{
    Response response;
    ResponseString responseString;
     //getter setters

}
并从方法返回
ResponseWrapper

public ResponseWrapper process(Applicant appl);
另请参见

选项1。 您可以返回您的客户响应

public class CustomResponse {

   private String responseString;
   private Response response;

   public void setResponseString(String responseString){
     this.responseString = responseString;
   }
   public String getResponseString(){
     return this.responseString;
   }

   public void setResponse(Response response){
     this.response = response;
   }
   public Response getResponse(){
     return this.response;
   }
}
备选案文2。 您可以将responseString作为参数传递。由于作为参数传递的非基本数据类型具有变量的引用,因此在设置responseString时,变量值将被更新

public Response process(Applicant appl,String responseString)
{
    String requestString;
    requestString = createRequestString(appl);
    responseString = sendRequest(requestString);
    Response response = parseResponse(responseString);
    return response;
}

为什么“Response”类不也保留“responseString”呢?它看起来像是一个明显的容器。相关:与这里的问题相同,在一般情况下,此解决方案将失败,因为您通常无法更改
响应
类。例如,如果是JSONObject或类似对象。这可能对OP有好处,但在大多数情况下不是一个好的解决方案。@allprog Yes这完全取决于..如果您能够更改响应对象,则这是一个解决方案。OP未提及我无法更改响应对象。