Eu estou pensando que isso pode não ser possível em Java porque a anotação e seus parâmetros são resolvidos em tempo de compilação. Eu tenho uma interface da seguinte maneira,
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
e outra classe como,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Marquei muitas classes com a anotação e gostaria de saber se posso evitar especificar as strings em todas as anotações que preferiria usar
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
No entanto, isso gera erros de compilação, como o valor da anotação, que deve ser um inicializador de matriz etc. Alguém sabe como eu posso usar uma constante String ou uma constante String [] para fornecer valor a uma anotação?
fonte
enum
em anotações, mas elas não são constantes em tempo de compilação. A diferença se torna aparente quando você escrevestatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
e tenta usarVARIABLE
em uma anotação; não vai funcionar. Você pode usar apenas oEnumType.ENUM_CONSTANT
que não é uma expressão constante, mas é especificamente permitido em anotações (eswitch
instruções).Você pode usar uma constante (ou seja, uma variável final estática) como parâmetro para uma anotação. Como um exemplo rápido, eu uso algo assim com bastante frequência:
Observe que é possível passar a
TEST_TIMEOUT
constante diretamente para a anotação.Imediatamente, não me lembro de ter tentado isso com uma matriz, então você pode estar enfrentando alguns problemas com pequenas diferenças em como as matrizes são representadas como parâmetros de anotação em comparação com variáveis Java? Mas, quanto à outra parte da sua pergunta, você pode definitivamente usar uma String constante sem problemas.
EDIT: Eu apenas tentei isso com uma matriz String, e não correr para o problema que você mencionou - no entanto o compilador que me dizer que o "valor do atributo deve ser constante", apesar da matriz que está sendo definido como
public static final String[]
. Talvez não goste do fato de que matrizes são mutáveis? Hmm...fonte
Você não está fornecendo uma matriz no seu exemplo. O seguinte compila bem:
fonte
Infelizmente, você não pode fazer isso com matrizes. Com variáveis que não são da matriz, o valor deve ser estático final.
fonte
Com o Seam 2 http://seamframework.org/, você conseguiu resolver os parâmetros de anotação em tempo de execução, com a linguagem de expressão entre aspas duplas.
No Seam 3 http://seamframework.org/Seam3/Solder , esse recurso é o módulo Seam Solder
fonte
Você pode usar enum e referenciá-lo no campo de anotação
fonte