Devo utilizzare invece un enum?
Non è possibile. Le variabili di annotazione devono essere costanti in fase di compilazione. Sia enumerici che stringhe sono, ma non è possibile creare un enum che sia una stringa e @RequestMapping
ha bisogno di una stringa (e se l'enumerazione ha un metodo che restituisce un campo stringa o stringa, non è una costante in fase di compilazione). Dato che ci sono più cicli di elaborazione delle annotazioni, funziona quando la costante si trova in un'altra classe.
Detto questo: si, direi che usare una classe di costanti dedicata (forse diverse, per diversi tipi di costanti) è una buona pratica che uso ogni volta che posso (e funziona con annotazioni purché la costante sia) non è definito all'interno della stessa unità di compilazione che ha l'annotazione e b) è inizializzato nella dichiarazione (al contrario di un blocco di inizializzatore statico)).
Ecco un esempio:
controller
@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE)
public class CustomerPageController{
// methods here
}
Costanti classe
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE = "path/to/customer/page"
// more constants
}
e qui ci sono alcune versioni che non funzionano:
a)
@Controller @RequestMapping(value = CUSTOMER_PAGE)
public class CustomerPageController{
private static final String CUSTOMER_PAGE = "path/to/customer/page";
}
Questo non verrà compilato poiché l'annotazione fa riferimento a una costante all'interno della classe annotata. Questo non può funzionare perché durante la compilazione, le annotazioni vengono elaborate in un giro separato prima del resto del codice, mentre la classe ha bisogno che l'annotazione sia già elaborata per la compilazione (es. C'è una dipendenza cicular tra annotazione e costante)
b)
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE;
static{
CUSTOMER_PAGE = "path/to/customer/page"
}
// more constants
}
Anche se questo è un campo finale statico, non è una fase di compilazione costante, quindi non può essere utilizzato come parametro di annotazione
fonte
2012-07-31 13:39:50
che cosa si intende per "rompere DRY"? Non funziona? puoi pubblicare la tua classe di costanti? – jontro
@jontro interrompendo DRY Intendo: il valore String può essere utilizzato in altre aree del codice, quindi il valore deve essere assegnato a una costante o enum. Non ho una classe di costanti, questo è solo il mio suggerimento –
@ user470184 se questo è solo per i mapping delle richieste, utilizzando intellij rimuove la necessità di questo in quanto indicizza i mapping delle richieste e li rende disponibili come testo intelli nelle posizioni appropriate. – NimChimpsky