So geben Sie einen Enum-Wert für eine Annotation aus einer Konstante in Java an

Ich kann eine aus einer Konstante entnommene Enumeration nicht als Parameter in einer Annotation verwenden. Ich erhalte den folgenden Kompilierungsfehler: "Der Wert für das Annotation-Attribut [attribute] muss ein konstanter Enum-Ausdruck sein".

Dies ist eine vereinfachte Version des Codes für die Enumeration:

public enum MyEnum {
    APPLE, ORANGE
}

Für die Anmerkung:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
    String theString();

    int theInt();

    MyEnum theEnum();
}

Und die Klasse:

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() {

    }

}

Der Fehler wird nur in "theEnum = MYENUM_CONSTANT" über methodB angezeigt. String- und int-Konstanten sind für den Compiler in Ordnung, die Enum-Konstante dagegen nicht, obwohl sie genau den gleichen Wert wie die über methodA hat. Sieht für mich so aus, als ob dies ein fehlendes Feature im Compiler ist, da alle drei offensichtlich Konstanten sind. Es gibt keine Methodenaufrufe, keine seltsame Verwendung von Klassen usw.

Was ich erreichen möchte, ist:

Verwendung von MYENUM_CONSTANT sowohl in der Annotation als auch später im Code.Geben Sie sicher zu bleiben.

Jeder Weg, um diese Ziele zu erreichen, wäre in Ordnung.

Bearbeiten:

Vielen Dank an alle. Wie Sie sagen, kann es nicht getan werden. Das JLS sollte aktualisiert werden. Diesmal habe ich mich entschlossen, Aufzählungen in Annotationen zu vergessen und normale int-Konstanten zu verwenden. Solange das int von einer benannten Konstante zugewiesen wird, sind die Werte begrenzt und es ist eine Art Safe.

Es sieht aus wie das:

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() {
...

Und ich kann MYENUMSIMUL_CONSTANT an einer anderen Stelle im Code verwenden.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage