【问题标题】:How I can return multiple values of different data types from a method? [duplicate]如何从一个方法返回多个不同数据类型的值? [复制]
【发布时间】:2013-08-17 09:34:03
【问题描述】:

我有以下方法,

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类的对象。我该怎么做?

【问题讨论】:

标签: java


【解决方案1】:

您可以创建一个包含两个值的自定义类型。

public class ResponseObject {
    private String responseString;

    private Response response;

    //accessors
}

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

【讨论】:

    【解决方案2】:

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

    public Object[] process(Applicant appl)
    {
    ...
    

    但您需要跟踪插入对象的索引(字符串、响应)

    另一种方式,您可以返回 Map<String, Object>,其中包含表示值的键。

    【讨论】:

      【解决方案3】:

      不,你不能。

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

      你能做的是,

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

      【讨论】:

      • 在一般情况下,此解决方案将失败,因为您通常无法更改 Response 类。例如。如果它是 JSONObject 或类似的。这可能对 OP 有好处,但对大多数情况来说不是一个好的解决方案。
      • @allprog 是的,这完全取决于..如果您能够更改响应对象,这是一个解决方案。OP 没有提到我无法更改响应对象。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果两个对象都是独立的实体,首选的方法是通过composition

            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
        }
        

        【讨论】:

          【解决方案6】:

          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);
          

          另请参阅

          Design patterns

          Defining Methods

          【讨论】:

            【解决方案7】:

            选项 1。 您可以返回您的 CustomerResponse。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-03-02
              • 2012-01-24
              • 2013-04-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多