Я не можу використовувати Enum, взятий з Constant, як параметр в анотації. Я отримую цю помилку компіляції: "Значення атрибута анотації [атрибут] має бути виразом константи переліку".
Це спрощена версія коду для Enum:
public enum MyEnum {
APPLE, ORANGE
}
Для анотації:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
І клас:
public class Sample {
public static final String STRING_CONSTANT = "hello";
public static final int INT_CONSTANT = 1;
public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE;
@MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello")
public void methodA() {
}
@MyAnnotation(theEnum = MYENUM_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
}
}
Помилка відображається лише в "theEnum = MYENUM_CONSTANT" над методомB. Константи string і int - це нормально для компілятора, константа Enum - ні, хоча це точно таке ж значення, як і значення over methodA. Мені здається, що це відсутня функція у компіляторі, оскільки всі три, очевидно, є константами. Тут немає викликів методів, немає дивного використання класів тощо.
Я хочу досягти:
- Щоб використовувати MYENUM_CONSTANT як в анотації, так і пізніше в коді.
- Щоб залишатися в безпеці.
Будь-який спосіб досягнення цих цілей був би чудовим.
Редагувати:
Дякую всім. Як ти кажеш, цього зробити не можна. JLS слід оновити. Цього разу я вирішив забути про перелічення в анотаціях і використати звичайні int-константи. Поки int присвоюється з іменованої константи, значення обмежуються, і це безпечний тип "типу".
Це виглядає так:
public interface MyEnumSimulation {
public static final int APPLE = 0;
public static final int ORANGE = 1;
}
...
public static final int MYENUMSIMUL_CONSTANT = MyEnumSimulation.APPLE;
...
@MyAnnotation(theEnumSimulation = MYENUMSIMUL_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
...
І я можу використовувати MYENUMSIMUL_CONSTANT в будь-якому іншому місці коду.