【问题标题】:Method returning varying types of object返回不同类型对象的方法
【发布时间】:2018-03-14 01:03:09
【问题描述】:

我正在使用 gson 和 volley 发出 http 获取请求。我的想法是让一个方法返回一个包含序列化 JSON 的对象。

public responseHolder getRequest(){
    //Make call
    //Parse Json into JsonObject
    return responseHolder;
}

我的问题是我希望该方法与返回不同数据的不同 api 调用一起使用。我有 3 个类旨在存储 3 个不同的调用,我希望该方法返回正确类型的对象。是否有一种方法或设计模式可以在这种情况下帮助我,或者我应该从不同的角度来处理它?

【问题讨论】:

    标签: java android design-patterns android-volley gson


    【解决方案1】:

    也许试试这个?

    private String getRequest()
    {
        // Make Call
        return jsonString;
    }
    
    public TypeA getA()
    {
        return new Gson().fromJson(getRequest(), TypeA.class);
    }
    
    public TypeB getB()
    {
        return new Gson().fromJson(getRequest(), TypeB.class);
    }
    
    public TypeC getC()
    {
        return new Gson().fromJson(getRequest(), TypeC.class);
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      public <T> T getRequest(Class<T> clazz){
          //Make call
          //Parse Json into JsonObject
          String json = ...;
          return new Gson().fromJson(json, clazz);
      }
      

      【讨论】:

        【解决方案3】:

        您可以创建三个响应类的超类。

        public class Response { ... }
        public class ResponseSubClass0 extends Response{ ... }
        public class ResponseSubClass1 extends Response{ ... }
        public class ResponseSubClass2 extends Response{ ... }
        

        然后将您的方法定义为返回响应。

        public Response getResponse(){
            //do stuff
            return response; //can be any of the subclass types
        }
        

        在任何使用getResponse() 的代码块中,如果您需要特定类的细节,您可以使用typeof 来检查它是哪一个。

        Response r = foo.getResponse();
        if(r instanceof ResponseSubClass0){
            ResponseSubClass0 rsc0 = (ResponseSubClass0)r;
            //do stuff
        }
        else if(r instanceof ResponseSubClass1){
            ResponseSubClass1 rsc1 = (ResponseSubClass1)r;
            //do other stuff
        }
        else if(r instanceof ResponseSubClass2){
            ResponseSubClass2 rsc2 = (ResponseSubClass2)r;
            //do other stuff
        }
        

        您还可以将 Response 设为接口并实现它,而不是扩展超类。

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多