[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] @DeclareParents static?
|
I'll look at that - possibly a bug.
Alex
On 12/16/05, Brian Ericson <bme@xxxxxxxx> wrote:
> I'm trying to understand the Moody example. My problem is that, when
> using the annotation style, everyone's CONFUSED -- if I confuse one
> instance, they all become confused (the advice is static)...
>
> The classic makes sense (I'm using RC1):
>
> Mood.java
> ---------
> package moodytest;
>
> public enum Mood { HAPPY, SAD, CONFUSED }
>
> ClassicMoodIndicator.aj
> -----------------------
> package moodytest;
>
> public aspect ClassicMoodIndicator {
> public interface Moody {}
>
> private Mood Moody.mood = Mood.HAPPY;
>
> public Mood Moody.getMood() { return mood; }
> public void Moody.setMood(Mood mood) { this.mood = mood; }
>
> declare parents : moodytest.ClassicMoodyImplementor implements Moody;
> }
>
> ClassicMoodImplementor.java
> ---------------------------
> package moodytest;
>
> public class ClassicMoodyImplementor { }
>
> ClassicMoodTester.java
> ----------------------
> package moodytest;
>
> import junit.framework.TestCase;
>
> public class ClassicMoodTester extends TestCase {
> ClassicMoodyImplementor cmi0 = null;
> ClassicMoodyImplementor cmi1 = null;
>
> public ClassicMoodTester(String name) { super(name); }
>
> protected void setUp() throws Exception {
> cmi0 = new ClassicMoodyImplementor();
> cmi1 = new ClassicMoodyImplementor();
> }
>
> public void testHappyDefault() {
> assertEquals("cmi0 should be happy!", Mood.HAPPY, cmi0.getMood());
> }
>
> public void testOneConfused() {
> cmi0.setMood(Mood.CONFUSED);
> assertEquals("cmi0 should now be confused", Mood.CONFUSED,
> cmi0.getMood());
> assertEquals("cmi1 should still be happy", Mood.HAPPY,
> cmi1.getMood());
> }
> }
>
> As expected, all ClassicMoodTester tests run successfully. Now, for the
> annotation style...
>
> AnnotationMoodIndicator.java
> ----------------------------
> package moodytest;
>
> import org.aspectj.lang.annotation.Aspect;
> import org.aspectj.lang.annotation.DeclareParents;
>
> @Aspect
> public class AnnotationMoodIndicator {
> public interface Moody {
> Mood getMood();
> void setMood(Mood mood);
> }
>
> public class MoodyImpl implements Moody {
> Mood mood = Mood.HAPPY;
>
> public Mood getMood() { return mood; }
> public void setMood(Mood mood) { this.mood = mood; }
> }
>
> @DeclareParents("moodytest.AnnotationMoodyImplementor")
> public static Moody introduced = new AnnotationMoodIndicator().new
> MoodyImpl();
> }
>
> AnnotationMoodyImplementor.java
> -------------------------------
> package moodytest;
>
> public class AnnotationMoodyImplementor { }
>
> AnnotationMoodTester.java
> -------------------------
> package moodytest;
>
> import junit.framework.TestCase;
>
> public class AnnotationMoodTester extends TestCase {
> AnnotationMoodyImplementor ami0 = null;
> AnnotationMoodyImplementor ami1 = null;
>
> public AnnotationMoodTester(String name) { super(name); }
>
> protected void setUp() throws Exception {
> ami0 = new AnnotationMoodyImplementor();
> ami1 = new AnnotationMoodyImplementor();
> }
>
> public void testHappyDefault() {
> assertEquals("ami0 should be happy!", Mood.HAPPY, ami0.getMood());
> }
>
> public void testOneConfused() {
> ami0.setMood(Mood.CONFUSED);
> assertEquals("ami0 should now be confused", Mood.CONFUSED,
> ami0.getMood());
> assertEquals("ami1 should still be happy", Mood.HAPPY,
> ami1.getMood());
> }
> }
>
> Now, running the AnnotationMoodTester tests results in the following:
> ..F
> Time: 0.021
> There was 1 failure:
> 1)
> testOneConfused(moodytest.AnnotationMoodTester)junit.framework.AssertionFailedError:
> ami1 should still be happy expected:<HAPPY> but was:<CONFUSED>
> at
> moodytest.AnnotationMoodTester.testOneConfused(AnnotationMoodTester.java:23)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>
> FAILURES!!!
> Tests run: 2, Failures: 1, Errors: 0
>
> Am I missing something, or is it intended that the introduction be
> static -- that all instances will always be of the same mood? Can I
> make the introduction non-static?
>
> P.S. AnnotationMoodTester will not compile using AJDT (I get an
> internal compiler error at the beginning of the class), but compiles
> fine by hand.
>
> P.P.S. I cannot compile all of the above classes in one pass using
> ajc. I need to first compile all but the tests, then compile the tests
> or the tests will not compile. Is this expected?
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>