Jak dostarczyć wartość wyliczenia do adnotacji ze stałej w Javie
Nie mogę użyć Enum pobranego ze stałej jako parametru w adnotacji. Dostaję ten błąd kompilacji: „Wartość atrybutu adnotacji [atrybut] musi być stałym wyrażeniem enum”.
To jest uproszczona wersja kodu Enum:
public enum MyEnum {
APPLE, ORANGE
}
Dla adnotacji:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
A klasa:
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() {
}
}
Błąd pojawia się tylko w „theEnum = MYENUM_CONSTANT” nad methodB. Stałe ciągów i int są poprawne dla kompilatora, stała Enum nie jest, nawet jeśli jest to dokładnie ta sama wartość co metoda overA. Wygląda na to, że jest to brakująca funkcja w kompilatorze, ponieważ wszystkie trzy są oczywiście stałymi. Nie ma wywołań metod, dziwnego użycia klas itp.
Chcę to osiągnąć:
Aby użyć MYENUM_CONSTANT zarówno w adnotacji, jak i później w kodzie.Aby pozostać bezpiecznym typem.Każdy sposób osiągnięcia tych celów byłby w porządku.
Edytować:
Dziękuje wszystkim. Jak mówisz, nie można tego zrobić. JLS powinien zostać zaktualizowany. Zdecydowałem się tym razem zapomnieć o wyliczeniach w adnotacjach i użyć stałych stałych int. Dopóki int jest przypisany z nazwanej stałej, wartości są ograniczone, a jego typ „bezpieczny”.
To wygląda tak:
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() {
...
I mogę użyć MYENUMSIMUL_CONSTANT gdziekolwiek indziej w kodzie.