我有一个调用各种web服务使用外部库的proyect。这个库给我反对这样的:Java:相同的对象,如何避免重复的代码
public static class ObjA {
@XmlElement(name = "counter", required = true)
protected BigInteger counter;
@XmlElement(name = "data", required = true)
protected String data;
[...]
}
这:
public static class ObjB {
@XmlElement(name = "counter", required = true)
protected BigInteger counter;
@XmlElement(name = "data", required = true)
protected String data;
[...]
}
,你可以看到objA和objB具有相同的属性,这样,如果我要同时使用,我已经重复码:
public class myClass {
[...]
private ObjA a;
private ObjB b;
[...]
public void myClass() {
[...]
this.a = new ObjectFactory().createObjA();
this.b = new ObjectFactory().createObjB();
[...]
}
public void init() {
this.initA();
this.initB();
}
private void initA() {
this.a.setCounter(BigInteger.ZERO);
this.a.setData = "";
}
private void initB() {
this.b.setCounter(BigInteger.ZERO);
this.b.setData = "";
}
[...]
}
INITA和INITB是相同的,我无法访问库的代码,所以我不能创建一个通用的接口,以何种方式,我可以减少重复的代码?我的意思是,有可能有这样的事情?
private void initObj([ObjA|ObjB] obj) {
obj.setCounter(BigInteger.ZERO);
obj.setData = "";
}
谢谢! Muchas Gracias!
编
请注意我有底层库中没有访问,所以我可以不加修改类,接口,WSDL或者XSD以任何方式。 另外,在我看来并不重要,如果我使用WS与否,JAXB或其他图书馆:你可以想像ObjA和ObjB没有注释,像这样:
public static class ObjA {
protected BigInteger counter;
protected String data;
[...]
}
public static class ObjB {
protected BigInteger counter;
protected String data;
[...]
}
和问题的症结没有按”改变。
如果你不能创建一个通用的接口(在本例中是抽象类),你必须编写代码来初始化'ObjA'类型和'ObjB'类型,而不管你做什么。 – EpicPandaForce 2015-02-11 16:44:14
您可以使用动态方法(反射或BeanUtil)使用相同方法处理不同类型的数据。然而,这有很多自己的问题(静态分析不知道它),所以我通常会远离它。我们对上下文不了解,所以也可能有其他解决方案。不要忘记与API提供商交谈。 – eckes 2015-02-11 20:35:55
我只想做一个超类,手工编辑生成的(猜测它只是每个类的一个地方),然后做一个阅读我和一个什么和为什么做视频。 – tgkprog 2015-02-12 07:35:34