Java украшает легкий путь - PullRequest
0 голосов
/ 01 июля 2010

Скажем, у вас есть API, который нельзя изменить:

List<LegacyObject> getImportantThingFromDatabase(Criteria c);

Imaging Legacy Object имеет множество полей, и вы хотите расширить его, чтобы упростить получение определенной информации:

class ImprovedLegacyObject extends LegacyObject {
   String getSomeFieldThatUsuallyRequiresIteratorsAndAllSortsOfCrap() {
       //cool code that makes things easier goes here
   }
}

Однако вы не можете просто привести к своему ImprovedLegacyObject, даже если поля все одинаковые, и вы не изменили какой-либо из базового кода, вы только добавили в него код, который использует LegacyObject все еще работает, но новый код легче писать.

Возможно ли иметь какой-нибудь простой способ преобразования LegacyObject в ImprovedLegacyObject без воссоздания всех полей или методов доступа? Это также должна быть быстрая операция, я знаю, что вы могли бы выполнить что-то, используя отражения для копирования всех свойств, но я не думаю, что это будет достаточно быстро, если вы сделаете это для масс LegacyObjects

РЕДАКТИРОВАТЬ: Есть ли что-нибудь, что вы могли бы сделать со статическими методами? Чтобы украсить существующий объект?

Ответы [ 2 ]

1 голос
/ 01 июля 2010

Вы должны будете выполнить копирование самостоятельно.У вас может быть конструктор, который делает это (называемый конструктором копирования):

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
}
1 голос
/ 01 июля 2010

Как насчет создания конструктора копирования для улучшенного устаревшего объекта, который принимает устаревший объект в качестве аргумента.Затем просто создайте новые объекты из старых.

...