假设您有一个无法更改的API:
List<LegacyObject> getImportantThingFromDatabase(Criteria c);
图像传统对象有大量字段,您希望对其进行扩展,以便更容易获取某些信息:
class ImprovedLegacyObject extends LegacyObject {
String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() {
//cool code that makes things easier goes here
}
}
但是,您不能只是转换为ImprovedLegacyObject
,即使字段完全相同且您没有更改任何底层代码,您也只是添加了它以便代码使用LegacyObject
仍然有效,但新代码更容易编写。
是否可以通过一些简单的方法将LegacyObject
转换为ImprovedLegacyObject
而无需重新创建所有字段或访问者?它也应该是一个快速的操作,我知道你可以通过使用反射来复制所有属性来执行某些操作,但我认为这样做对于大量LegacyObjects
答案 0 :(得分:1)
如何为改进的旧对象制作一个复制构造函数,该复制构造函数将Legacy Object作为参数。然后只需从旧的对象中创建新对象。
答案 1 :(得分:1)
您必须自己进行复制。你可以有一个构造函数来执行此操作(称为复制构造函数):
public ImprovedLegacyObject(LegacyObject legacyObject) {
...
//copy stuff over
this.someField = legacyObject.getSomeField();
this.anotherField = legacyObject.getAnotherField();
...
}
或者您可以使用返回ImprovedLegacyObject
public static ImprovedLegacyObject create(LegacyObject legacyObject) {
...
//copy stuff over
...
return improvedLegacyObject;
}
如果您计划将此行为扩展到其他旧对象,则应创建一个接口
public interface CoolNewCodeInterface {
public String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() {
}
public String getSomeFieldInAReallyCoolWay() {
}
}
然后你的ImprovedLegacyObject
会是这样的:
public ImprovedLegacyObject extends LegacyObject implements CoolNewCodeInterface {
//implement methods from interface
}