Аспектно-ориентированное программирование: различия между версиями
Содержимое удалено Содержимое добавлено
Строка 145:
Если мы хотим ввести в общее употребление аспект, рассмотренный в предыдущем разделе, таким образом, чтобы стало возможным многократное использование кода timestamp для множества объектов, следует определить интерфейс с именем ''TimestampedObject'', и далее использовать ''introduction'' для добавления тех же самых членов и переменных в интерфейс вместо конкретного класса:
<source lang="java">
{
long getTimestamp();
void timestamp();
}
public aspect Timestamp
{
private long TimestampedObject.timestamp;
public long TimestampedObject.getTimestamp() {
return timestamp;
}
{
this.timestamp = System.currentTimeMillis();
}
}
</source>
Теперь можно использовать синтаксис declare parents, чтобы заставить ValueObject реализовать новый интерфейс. Конструкция declare parents, как и другие выражения для типов в AspectJ, могут быть применены к нескольким типам одновременно.
<
После того как определены операции, поддерживаемые интерфейсом ''TimestampedObject'', можно использовать ''pointcut''-ы и ''advice'' для автоматического обновления меток времени (timestamp) при возникновении подходящих условий. Так, дополнение к ''Timestamp'', показанное ниже, регистрирует время каждого вызова ''setter'' метода:
<source lang="java">
execution(public void TimestampedObject+.set*(..)) &&
this(object);
/*TimestampedObject+ означает любой подкласс TimestampedObject*/
after(TimestampedObject object) : objectChanged(object)
{ object.timestamp();
}
</source>
Заметьте, что ''pointcut'' определяет аргументы, используемые в ''advice'' типа ''after()'' — в данном случае, это ''TimestampedObject'', имеющий метод установки set.
|