假设您有一个无法更改的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的质量来说不够快。
编辑:你能用静态方法做些什么吗装饰现有的对象?

最佳答案

你得自己复印您可以有一个执行此操作的构造函数(称为复制构造函数):

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
}

10-06 03:11