Ich denke, dass dies in Java möglicherweise nicht möglich ist, da Annotation und ihre Parameter zur Kompilierungszeit aufgelöst werden. Ich habe eine Schnittstelle wie folgt:
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
und eine andere Klasse als,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Ich markiere viele Klassen mit der Annotation und möchte wissen, ob ich es vermeiden kann, die Zeichenfolgen in jeder Annotation anzugeben, die ich stattdessen lieber verwenden würde
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
Dies führt jedoch zu Kompilierungsfehlern, z. B. sollte der Annotationswert ein Array-Initialisierer usw. sein. Weiß jemand, wie ich eine String-Konstante oder eine String [] -Konstante verwenden kann, um einer Annotation einen Wert zu liefern?
quelle
enum
in Anmerkungen verwenden, aber sie sind keine Konstante für die Kompilierungszeit. Der Unterschied wird deutlich, wenn Sie schreibenstatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
und versuchen, ihnVARIABLE
in einer Anmerkung zu verwenden. es wird nicht funktionieren. Sie können nur verwenden,EnumType.ENUM_CONSTANT
was kein konstanter Ausdruck ist, sondern speziell in Anmerkungen (undswitch
Anweisungen) zulässig ist .Sie können eine Konstante (dh eine statische endgültige Variable) als Parameter für eine Anmerkung verwenden. Als schnelles Beispiel verwende ich so etwas ziemlich oft:
Beachten Sie, dass es möglich ist, die
TEST_TIMEOUT
Konstante direkt in die Annotation zu übergeben.Ich erinnere mich nicht, dass ich dies jemals mit einem Array versucht habe, sodass Sie möglicherweise auf einige Probleme mit geringfügigen Unterschieden bei der Darstellung von Arrays als Anmerkungsparameter im Vergleich zu Java-Variablen stoßen. Aber für den anderen Teil Ihrer Frage könnten Sie definitiv ohne Probleme einen konstanten String verwenden.
BEARBEITEN: Ich habe dies gerade mit einem String-Array versucht und bin nicht auf das von Ihnen erwähnte Problem gestoßen. Der Compiler hat mir jedoch mitgeteilt, dass der "Attributwert konstant sein muss", obwohl das Array als definiert ist
public static final String[]
. Vielleicht gefällt es nicht, dass Arrays veränderlich sind? Hmm ...quelle
Sie liefern in Ihrem Beispiel kein Array. Folgendes kompiliert gut:
quelle
Mit Arrays ist dies leider nicht möglich. Bei Nicht-Array-Variablen muss der Wert endgültig statisch sein.
quelle
Mit Seam 2 http://seamframework.org/ konnten Sie Annotationsparameter zur Laufzeit auflösen, wobei die Ausdruckssprache in doppelte Anführungszeichen gesetzt wurde.
In Seam 3 http://seamframework.org/Seam3/Solder ist diese Funktion das Modul Seam Solder
quelle
Sie können enum verwenden und diese Aufzählung im Anmerkungsfeld referenzieren
quelle