Могу ли я использовать объявление между типами, чтобы добавить свойство? - PullRequest
0 голосов
/ 08 августа 2011

У нас есть доменные объекты, которые расширяют абстрактный базовый класс для поддержки метки времени

abstract class TimestampedObject {
    private Date timestamp;
    public Date getTimestamp(){return timestamp;}
    public void setTimestamp(final Date timestamp){this.timestamp = timestamp;}
}

Но это загромождает нашу иерархию.

Можем ли мы использовать представления Spring AOP или ITD Aspectj для достижения этой цели

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Пример прямо из книги AspectJ in Action (из памяти, не проверенной) будет выглядеть примерно так:

public interface Timestamped {
   long getTimestamp();
   void setTimestamp();

   public static interface Impl extends Timestamped {
        public static aspect Implementation {
              private long Timestamped.Impl.timestamp;
              public long Timestamped.Impl.getTimestamp(){ return timestamp; }
              public void Timestamped.Impl.setTimestamp(long in) { timestamp = in; }
        }          
   }

   //and then your classes would use it like this:
   public class SomeClass implements Timestamped.Impl {

           private void someFunc() {
              setTimestamp(12);
              long t = getTimestamp();
           }
    }

Не уверен, что в книге так было или нет, но я обычно создаюотдельный интерфейс Impl (как показано выше), который просто расширяет основной, так что некоторые из моих классов могут по-разному реализовывать метки времени, не получая реализацию ITD.Вот так:

public class SomeOtherClass implements Timestamped {
       private long myOwnPreciousTimestamp;

       public long getTimestamp() {
            //Oh! I don't know should I give it to you?!
            //I know, I will only give you a half of my timestamp
            return myOwnPreciousTimestamp/2;
       }

       //etc.....
}
0 голосов
/ 08 августа 2011
...