2012-07-31 22 views
8

veo esta dispersa en la base de código:¿Debería declararse el valor de mapeo en una constante o como una enumeración?

@RequestMapping(value = "myValue") 

yo preferiría usar algo como esto:

@RequestMapping(value = Constants.myValue) 

Parece que romper en seco utilizando el valor de cadena real dentro @RequestMapping en lugar de constante. Pero, ¿es esta buena práctica de código? ¿Debo usar una enumeración en su lugar? Es posible que necesite usar Constants.myValue en otra parte de la base de código.

+0

¿Qué quiere decir por "romper seco"? ¿Esto no funciona? ¿puedes enviarnos tu clase de constantes? – jontro

+0

@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 –

+0

@ 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

Respuesta

12

¿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

+0

@NimChimpsky es trivial, ver arriba –

+0

Ah, vale, pensé directamente con una enumeración. También puede hacer referencia a la clase de correlaciones una enumeración – NimChimpsky

+1

esto funciona: '@RequestMapping (MyController.PATH) public class MyController { protected static final String PATH ="/some-path "; ... ' –

Cuestiones relacionadas