HotLog

суббота, 29 января 2011 г.

PropertyChangeSupport и AspectJ

Когда надо создать несколько java-beans с извещением об изменении свойств, обычно заводят общий класс-предок:


И тогда java-bean выглядит примерно так:


Налицо дублирование кода. Повторящийся шаблон ("XXX" - заменяет переменную часть):


Основная цель аспектов - убирать дублирующийся код, встречающийся во многих методах. Это как раз тот случай. Заодно можно будет убрать и надоедливый "extends PropertyChange".

Теперь надо подумать, как aspectJ будет отличать сеттеры, в которые надо добавить общий код от остальных. Проще всего проставить аннотацию над классом и отобрать все сеттеры с одним аргументом.
Аннотация выглядит так:


Тогда bean можно будет писать в более простом виде:


И сам аспект:

Или в annotation-style:


Теперь по шагам:
  1. Все классы, аннотированные @Bean будут наследовать PropertyChange (в случае с аннотациями они будут наследовать только интерфейс IPropertyChange, а реализация методов будет браться из PropertyChange).

    Или в annotation-style:

  2. Все нужные нам сеттеры - это методы типа void, принимающие один параметр, находящиеся в классе, помеченные аннотацией @Bean.

    Или в annotation-style:

  3. Перед вызовом сеттера запоминаем текущее значение свойства в переменную oldValue(//1). Выполняем сеттер (//2) и публикуем сообщение (//3).

    Или в annotation-style:

Комментариев нет:

Отправить комментарий