我试图解决以下继承问题。我有一个Web服务,有几个类可以通过URI访问: 例如URI:
http://localhost:8080/WebApp/data/someData/1
将HTTP GET-Request作为application / xml返回,如下所示:
<someData>
<name>Very Important Data</name>
<id>2</id>
<description>Second Test Data</description>
</someData>
在我的SomeData类中,我有一个静态方法,它将上面给出的URI转换为SomeData对象。该方法如下所示:
public static SomeData create(URI resourceUri) {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
WebResource webResource = client.resource(resourceUri);
SomeData someData = webResource.accept(MediaType.APPLICATION_XML).get(SomeData.class);
return someData;
}
到目前为止这是有效的。但是我有几个这样的数据类,每次创建新的数据对象时我都不想写这个方法。因为我的理解 该方法对于所有对象都是相同的,除了一行只有返回类型和类描述因对象而异:
SomeData someData = webResource.accept(mediaType).get(SomeData.class);
现在我最初的想法是创建一个继承树,其中根类(即父类)具有类似上述创建方法的方法。 那么他们只有一次实现此方法并将其用于从基类继承的所有类吗? 我的直觉告诉我,这不起作用,但我可能是错的。
也许更好的解决方案是创建一个具有创建对象的Class参数的静态工厂方法。像这样:
public class SomeDataFactory {
public static SomeDataParent create(URI resourceUri, Class<? extends SomeDataParent> clazz) {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
WebResource webResource = client.resource(resourceUri);
SomeDataParent someData = webResource.accept(MediaType.APPLICATION_XML).get(clazz);
return someData;
}
}
我会这样称呼:
SomeData someData = (SomeData) SomeDataFactory.create(new URI(http://localhost:8080/WebApp/data/someData/1), SomeData);
这只是一次可行(例如良好且有效)的解决方案吗?我仍然需要在没有任何共同点的对象之间继承 除此之外,它们可以从URI创建。
通过这种方法,我不喜欢你必须为创建方法添加一个强制转换。我的意思是应该清楚这个方法创建的是什么因为我传递了类的 对象我想要创建。
赞赏任何意见。
问候
答案 0 :(得分:1)
实际上,您的代码可以通过这种方式得到改进,您不需要继承不相关的实体(这是非常糟糕的设计决策)和任何强制转换。解决方案 - 泛型。首先我看了JavaDoc for WebResource.Builder#get method。它给了我一个线索,我想出了以下代码,它编译时没有任何警告,也没有包含演员表:
public static <T> T create(URI resourceUri, Class<T> clazz) {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
WebResource webResource = client.resource(resourceUri);
T someData = webResource.accept(MediaType.APPLICATION_XML).get(clazz);
return someData;
}
所以对上面方法的调用将是这样的:
SomeData someData = SomeDataFactory.create(yourUri, SomeData.class);
或
SomeOtherData someOtherData = SomeDataFactory.create(yourUri, SomeOtherData.class);
祝你好运!