【发布时间】:2015-02-11 16:40:56
【问题描述】:
我有一个使用外部库调用各种网络服务的项目。这个库给了我这样的对象:
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 = "";
}
谢谢!穆夏斯·格拉西亚斯!
附录
请注意,我无法访问底层库,因此我无法以任何方式添加修改类、接口、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不管你做什么。跨度> -
您可以使用动态方法(反射或 BeanUtil)以相同的方法处理不同的类型。然而,这有许多自己的问题(静态分析不知道),所以我通常会远离它。我们对上下文一无所知,因此可能还有其他解决方案。并且不要忘记与 API 提供者交谈。
-
我会创建一个超级类,手动编辑生成的(猜想每个类只有一个地方),然后阅读我和一段视频,说明做了什么以及为什么做了。
-
@tgkprog 我无法“手动编辑生成的”,我无权访问源代码。无论如何,我认为如果由于某种原因必须重新生成代码,则强制重新编辑代码真的很糟糕。
标签: java oop code-duplication