¿Debo usar un enumeración en su lugar?
No puede. Las variables de anotación deben ser constantes de tiempo de compilación. Los literales Enums y String son ambos, pero no se puede crear una enumeración que sea String y @RequestMapping
necesita una cadena (y si su enumeración tiene un método que devuelve un campo String o String, no es una constante en tiempo de compilación). Como hay varias rondas de procesamiento de anotación, funciona cuando la constante está en otra clase.
Dicho esto: sí, yo diría que usar una clase de constantes dedicadas (quizás varias, para diferentes tipos de constantes) es una buena práctica que uso siempre que puedo (y funciona con anotaciones siempre que la constante a) no se define dentro de la misma unidad de compilación que tiene la anotación yb) se inicializa en la declaración (a diferencia de un bloque de inicializador estático)).
He aquí un ejemplo:
controlador clase
@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE)
public class CustomerPageController{
// methods here
}
Constantes
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE = "path/to/customer/page"
// more constants
}
Y aquí hay algunas versiones que no funciona:
una)
@Controller @RequestMapping(value = CUSTOMER_PAGE)
public class CustomerPageController{
private static final String CUSTOMER_PAGE = "path/to/customer/page";
}
Esto no compilará porque la anotación hace referencia a una constante dentro de la clase que anota. Esto no puede funcionar porque durante la compilación, las anotaciones se procesan en una ronda separada antes del resto del código, mientras que la clase necesita la anotación para procesarse para compilación (es decir, hay una dependencia cícular entre anotación y constante)
b)
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE;
static{
CUSTOMER_PAGE = "path/to/customer/page"
}
// more constants
}
Aunque este es un campo static final, no es una constante en tiempo de compilación, por lo tanto no se puede utilizar como un parámetro de anotación
¿Qué quiere decir por "romper seco"? ¿Esto no funciona? ¿puedes enviarnos tu clase de constantes? – jontro
@jontro rompiendo DRY Quiero decir: el valor String se puede usar en otras áreas del código, por lo que el valor se debe asignar a una constante o enum. No tengo una clase de constantes, esta es solo mi sugerencia –
@ user470184 si esto es solo para mapeos de solicitudes, el uso de intellij elimina la necesidad de esto ya que indexa las asignaciones de solicitudes y las pone a disposición como texto inteligente en los lugares apropiados. – NimChimpsky