Я хочу использовать Аннотацию в безопасной от компиляции форме.
Для передачи значения () к Аннотации, я хочу использовать Строковое представление перечисления.
Существует ли способ использовать @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.
Точка, я могу сделать это
@A("" + 1)
void foo() {
}
Но здесь значение атрибута "требований компилятора должно быть постоянным". Постоянный Is'nt E.a?
@A("" + E.a)
void foo() {
}
Проблема в том, что вы умнее компилятора :-)
Ea
- константа, но EatoString ( )
нет. Похоже, так и должно быть, но компилятор не может этого понять.
Причина, по которой работают "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:
@interface A {
E value();
}
Затем вы можете использовать
@A(E.a)