Java 枚举和注释

Java 枚举和注释,java,annotations,Java,Annotations,我想使用编译安全形式的注释 要将value()传递给注释,我希望使用枚举的字符串表示形式 有没有办法将@a与enum 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

我想使用编译安全形式的注释

要将value()传递给注释,我希望使用枚举的字符串表示形式

有没有办法将@a与enum 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中的字符串类型

关键是我能做到

@A("" + 1)
    void foo() {
}
但在这里,编译器声称“属性值必须是常量”。E不是常数吗

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

在类型E的注释中设置值:

@interface A {
   E value();
}
然后你可以用

@A(E.a)

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

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";
};

“E必须是枚举吗?你可以试试:…”我想你也可以用枚举做类似的事情。您必须在
E
的构造函数中传入所需的字符串,然后将其分配给
公共最终字符串strresentation
。然后只需执行
@A(E.strresentation)
@matrixprog,即使我将
公共最终字符串strresentation=“foo”