Je pense que cela n'est peut-être pas possible en Java car l'annotation et ses paramètres sont résolus au moment de la compilation. J'ai une interface comme suit,
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
et une autre classe comme,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Je marque de nombreuses classes avec l'annotation et j'aimerais savoir si je peux éviter de spécifier les chaînes dans chaque annotation que je préférerais plutôt utiliser
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
Cependant, cela donne des erreurs de compilation comme la valeur d'annotation devrait être un initialiseur de tableau, etc. Est-ce que quelqu'un sait comment je peux utiliser une constante String ou une constante String [] pour fournir une valeur à une annotation?
la source
enum
dans les annotations, mais ce n'est pas une constante de compilation. La différence devient apparente lorsque vous écrivezstatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
et essayez d'utiliserVARIABLE
dans une annotation; ça ne marchera pas. Vous ne pouvez utiliser queEnumType.ENUM_CONSTANT
ce qui n'est pas une expression constante, mais spécifiquement autorisée dans les annotations (et lesswitch
instructions).Vous pouvez utiliser une constante (c'est-à-dire une variable finale statique) comme paramètre pour une annotation. À titre d'exemple rapide, j'utilise assez souvent quelque chose comme ça:
Notez qu'il est possible de passer la
TEST_TIMEOUT
constante directement dans l'annotation.De façon désinvolte, je ne me souviens pas avoir déjà essayé cela avec un tableau, vous pouvez donc rencontrer des problèmes avec de légères différences dans la façon dont les tableaux sont représentés en tant que paramètres d'annotation par rapport aux variables Java? Mais comme pour l'autre partie de votre question, vous pouvez certainement utiliser une chaîne constante sans aucun problème.
EDIT: Je viens d'essayer cela avec un tableau String, et je n'ai pas rencontré le problème que vous avez mentionné - cependant le compilateur m'a dit que la "valeur d'attribut doit être constante" malgré le tableau défini comme
public static final String[]
. Peut-être que cela n'aime pas le fait que les tableaux sont mutables? Hum ...la source
Vous ne lui fournissez pas un tableau dans votre exemple. Ce qui suit se compile bien:
la source
Malheureusement, vous ne pouvez pas faire cela avec des tableaux. Avec les variables non-tableau, la valeur doit être statique finale.
la source
Avec Seam 2 http://seamframework.org/, vous avez pu résoudre les paramètres d'annotation au moment de l'exécution, avec un langage d'expression entre guillemets.
Dans Seam 3 http://seamframework.org/Seam3/Solder , cette fonctionnalité est le module Seam Solder
la source
Vous pouvez utiliser enum et faire référence à cette énumération dans le champ d'annotation
la source