Аспектно-ориентированное программирование: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 145:
Если мы хотим ввести в общее употребление аспект, рассмотренный в предыдущем разделе, таким образом, чтобы стало возможным многократное использование кода timestamp для множества объектов, следует определить интерфейс с именем ''TimestampedObject'', и далее использовать ''introduction'' для добавления тех же самых членов и переменных в интерфейс вместо конкретного класса:
 
<source lang="java">
<pre>public interface TimestampedObject {
{
long getTimestamp();
void timestamp();
}
 
public aspect Timestamp {
{
private long TimestampedObject.timestamp;

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