Я не могу использовать Enum, взятый из константы в качестве параметра в аннотации. Я получаю эту ошибку компиляции: "Значение атрибута аннотации [attribute] должно быть постоянным выражением enum".
Это упрощенная версия кода для 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. Строковые и int-константы в порядке с компилятором, константа Enum - нет, хотя это то же самое значение, что и метод overA. Мне кажется, что это недостающая особенность в компиляторе, потому что все три являются, очевидно, константами. Нет вызовов методов, странного использования классов и т.д.
Чего я хочу достичь:
- Чтобы использовать MYENUM_CONSTANT как в аннотации, так и позже в коде.
- Чтобы сохранить тип безопасности.
Любой способ достичь этих целей будет в порядке.
Edit:
Спасибо всем. Как вы говорите, это невозможно. 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 где-нибудь еще в коде.