Java 枚举和注释
我想使用编译安全形式的注释 要将value()传递给注释,我希望使用枚举的字符串表示形式 有没有办法将@a与enum E中的值一起使用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
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”在E上,我得到属性值必须是常量