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.

questionAnswers(5)

yourAnswerToTheQuestion