Ich kann eine Aufzählung aus einer Konstante nicht als Parameter in einer Anmerkung verwenden. Ich erhalte den folgenden Kompilierungsfehler: "Der Wert für das Annotationsattribut [Attribut] muss ein konstanter Enum-Ausdruck sein".
Dies ist eine vereinfachte Version des Codes für die Aufzählung:
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 Methode B angezeigt. String- und Int-Konstanten sind mit dem Compiler in Ordnung, die Enum-Konstante jedoch nicht, obwohl sie genau den gleichen Wert wie die über methodA hat. Sieht für mich so aus, als ob dies eine fehlende Funktion 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 Anmerkung als auch später im Code.
- Um typsicher 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 beschlossen, Aufzählungen in Anmerkungen zu vergessen und reguläre int-Konstanten zu verwenden. Solange das int von einer benannten Konstante zugewiesen wird, sind die Werte begrenzt und es ist eine Art Typ sicher.
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.