【问题标题】: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 设为接口并实现它,而不是扩展超类。