Estoy pensando que esto puede no ser posible en Java porque la anotación y sus parámetros se resuelven en tiempo de compilación. Tengo una interfaz de la siguiente manera,
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
y otra clase como,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Marco muchas clases con la anotación y me gustaría saber si puedo evitar especificar las cadenas en cada anotación que preferiría usar
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
Sin embargo, esto genera errores de compilación como que el valor de anotación debe ser un inicializador de matriz, etc. ¿Alguien sabe cómo puedo usar una constante de cadena o una constante de cadena [] para proporcionar valor a una anotación?
fuente
enum
en anotaciones, pero no son constantes en tiempo de compilación. La diferencia se hace evidente cuando escribestatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
e intenta usarVARIABLE
en una anotación; No funcionará. Solo puede usar loEnumType.ENUM_CONSTANT
que no es una expresión constante, sino que se permite específicamente en anotaciones (yswitch
declaraciones).Puede usar una constante (es decir, una variable final estática) como parámetro para una anotación. Como ejemplo rápido, uso algo como esto con bastante frecuencia:
Tenga en cuenta que es posible pasar la
TEST_TIMEOUT
constante directamente a la anotación.Por casualidad, no recuerdo haber intentado esto con una matriz, por lo que es posible que tenga algunos problemas con pequeñas diferencias en la forma en que las matrices se representan como parámetros de anotación en comparación con las variables de Java. Pero en cuanto a la otra parte de su pregunta, definitivamente podría usar una cadena constante sin ningún problema.
EDIT: He acaba de intentar esto con una matriz de cadenas, y no encontrarse con el problema que usted ha mencionado - sin embargo, el compilador no me diga que el "valor del atributo debe ser constante" a pesar de la matriz se define como
public static final String[]
. ¿Quizás no le gusta el hecho de que las matrices son mutables? Hmm ...fuente
No le está proporcionando una matriz en su ejemplo. Lo siguiente compila bien:
fuente
Desafortunadamente, no puede hacer esto con matrices. Con variables sin matriz, el valor debe ser estático final.
fuente
Con Seam 2 http://seamframework.org/ pudo resolver los parámetros de anotación en tiempo de ejecución, con lenguaje de expresión entre comillas dobles.
En Seam 3 http://seamframework.org/Seam3/Solder , esta característica es el módulo Seam Solder
fuente
Puede usar enum y referir esa enumeración en el campo de anotación
fuente