枚举和注释

时间:2010-03-27 19:53:17

标签: java annotations

我想以编译安全的形式使用Annotation。

要将值()传递给Annotation,我想使用枚举的String表示。

有没有办法将@A与枚举E中的值一起使用?

public class T {

    public enum E {
        a,b;
    }

    // C1: i want this, but it won't compile
    @A(E.a)
    void bar() {

    // C2: no chance, it won't compile
    @A(E.a.toString())
    void bar2() {

    }
    // C3: this is ok
    @A("a"+"b")
    void bar3() {

    }

    // C4: is constant like C3, is'nt it ?
    @A(""+E.a)
    void bar4() {

    }
}

@interface A {
    String value();
}

更新

我需要@A中的String类型。

关键是我能做到这一点

@A("" + 1)
    void foo() {
}

但是编译器声称“属性值必须是常量”。 Is'nt E.a不变吗?

@A("" + E.a)
    void foo() {
}

2 个答案:

答案 0 :(得分:10)

问题是你比编译器更聪明:-)

E.a是常量,但E.a.toString()不是。它看起来应该是,但编译器无法解决这个问题。

"a"+"b""" + 1工作的原因是编译器足够聪明,可以在编译时生成常量。

当它看到"" + E.a时,会使用E.a.toString()。对toString()的调用足以将其抛弃。

E必须是枚举吗?你可以尝试:

public final class E {
  public static final String a = "a";
  public static final String b = "b";
};

答案 1 :(得分:7)

在E类型的注释中创建值:

@interface A {
   E value();
}

然后你可以使用

@A(E.a)