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

3
我有以下方法:

public Response process(Applicant appl)
{

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

我希望能够同时返回responseString和response两个值,一个是字符串类型的,另一个是Response类的对象。请问如何实现?


3
为什么不让“Response”类也保存“responseString”的值?这看起来是它的最佳容器。 - Joachim Sauer
1
相关:http://stackoverflow.com/questions/17830949/how-to-return-an-integer-or-int-and-a-list-from-a-method-in-java - hmjd
1
同这里的问题:https://dev59.com/VXE95IYBdhLWcg3wI6ft - HpTerm
7个回答

5

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

public class ResponseObject {
    private String responseString;

    private Response response;

    //accessors
}

然后将该类的实例作为结果返回。

3
你可以按照以下方式返回对象数组:
public Object[] process(Applicant appl)
{
...

但是您需要跟踪插入对象(String,Response)的索引。
另一种方法是返回具有代表值的键的Map。

2

不,你不能这样做。

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

你可以做的是,在Response类中创建一个叫做responseString的字段,并添加settersgetters

public Response process(Applicant appl)
{

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

2
通常情况下,这种解决方案会失败,因为您通常无法更改“Response”类。例如,如果它是JSONObject或类似的对象。这对于OP可能是好的,但对于大多数情况来说并不是一个好的解决方案。 - allprog
@allprog 是的,这完全取决于情况。如果您能更改响应对象,那么这是一个解决方案。OP没有提到我不能更改响应对象。 - Suresh Atta

2
你需要为此创建一个包装类。与其他语言不同,Java语言不支持自动解包的元组返回值。只需创建一个数据类,如下所示:
class ResponseData {
    public final String responseString;
    public final Response response;

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

0

如果两个对象是独立的实体,最好的方法是通过组合来实现:

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

    return new compositObj(response, responseString);




  class compositObj{
      Response res;
      String resString;
      compositObj(Response r, String s){
        res = r;
        resString = s;
    }
    //getters setters if needed
}

0

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

方法签名:方法声明的两个组成部分构成了方法签名——方法的名称和参数类型。

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

然而,有几种方法可以返回不同的对象类型。

对象类型

返回Object类型,因为所有类都是Object类型,然后将其转换为适当的类型。

public Object process(Applicant appl);

继承

定义一个基类,从基类派生ResponseResponseString

class ResponseBase
{

}

并派生出你的类

class Response extends ResponseBase{...}
class ResponseString ResponseBase{...}

从你的方法中返回基类

public ResponseBase process(Applicant appl);

组合

将你的ResponseResponseString包装到一个包装类中并返回它。

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

}

在你的方法中返回ResponseWrapper

public ResponseWrapper process(Applicant appl);

另请参阅

设计模式

定义方法


0

选项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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接