[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RES: [aspectj-users] Capturing setting inside List
|
Thank you very mutch Matthew!
Your tip works very well :-)
-----Mensagem original-----
De: aspectj-users-bounces@xxxxxxxxxxx
[mailto:aspectj-users-bounces@xxxxxxxxxxx] Em nome de Matthew Webster
Enviada em: sexta-feira, 15 de abril de 2005 07:24
Para: aspectj-users@xxxxxxxxxxx
Assunto: Re: [aspectj-users] Capturing setting inside List
André,
This is a classic example of the GoF Observer pattern which can easily be
applied using an aspect (I have modified you example to make it compile):
public aspect ObserverPattern {
private interface Subject {
public void addObserver (Observer o);
public void notifyObservers();
}
private interface Observer {
public void update ();
}
/*
* Make B the subject of the Observer pattern
*/
declare parents : B implements Subject;
private Set Subject.observers = new HashSet();
public void Subject.addObserver (Observer o) {
observers.add(o);
}
public void Subject.notifyObservers() {
for (Iterator i = observers.iterator();i.hasNext();) {
Observer o = (Observer)i.next();
o.update();
}
}
pointcut addObserver (Observer o, Subject s) :
execution(void A.add(..)) && this(o) && args(s);
after (Observer o, Subject s) returning : addObserver(o, s) {
s.addObserver(o);
}
pointcut modified (Subject s) :
execution(* set*(..)) && this(s);
after (Subject s) returning : modified (s) {
s.notifyObservers();
}
/*
* Make A the observer
*/
declare parents : A implements Observer;
public void A.update () {
A.serialize(this);
}
}
public class A implements Serializable {
List list = new ArrayList();
public void add(Object o) {
list.add(o);
}
public static void serialize (A a) {
System.out.println("? serialize() a=" + a);
}
}
public class B {
int x;
public void setX(int x) {
this.x = x;
}
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
B b1 = new B();
a1.add(b1);
A a2 = new A();
B b2 = new B();
a2.add(b2);
b1.setX(3); // a1 affected
}
}
Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester, SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/
André Dantas Rocha <ad-rocha@xxxxxxxxxx>@eclipse.org on 14/04/2005 21:14:09
Please respond to aspectj-users@xxxxxxxxxxx
Sent by: aspectj-users-bounces@xxxxxxxxxxx
To: <aspectj-users@xxxxxxxxxxx>
cc:
Subject: [aspectj-users] Capturing setting inside List
Suppose I have this classes...
public class A implement Serializable {
List list = new ArrayList();
public add(Object o) {
list.add(o);
}
}
public class B {
int x;
setX(int x) {
this.x = x;
}
}
... and a main method:
public void main(String[] args) {
a1 = new A();
b1 = new B();
a1.add(b1);
a2 = new A();
b2 = new B();
a2.add(b2);
b1.setX(3); // a1 affected
}
I would like to serialize the A object every time an element in his List is
modified (in this case, only a1 will be serialized).
Is it possible to intercep this pointcut using AspectJ?
Thanks,
André_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users