2012-07-31 16 views
8

Vedo questo sparsi base di codice:Il valore di mappatura deve essere dichiarato in una costante o come enum?

@RequestMapping(value = "myValue") 

Io preferirei usare qualcosa di simile:

@RequestMapping(value = Constants.myValue) 

Sembra rompere a secco utilizzando il valore della stringa reale all'interno @RequestMapping anziché costante. Ma questa pratica di codice è buona? Dovrei invece usare un enum? Potrebbe essere necessario utilizzare Constants.myValue altrove nella base del codice.

+0

che cosa si intende per "rompere DRY"? Non funziona? puoi pubblicare la tua classe di costanti? – jontro

+0

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

+0

@ 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

risposta

12

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

+0

@NimChimpsky è banale, vedi sopra –

+0

Ah, ok, ho pensato direttamente con un enum. Si potrebbe anche fare riferimento alla classe mappings su enum – NimChimpsky

+1

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

Problemi correlati