2013-05-12 8 views
40

Uso annotation nel mio codice e cerco di utilizzare il valore che determina in fase di esecuzione.Elimina "Il valore per l'attributo di annotazione deve essere un'espressione costante" messaggio

Definisco la mia lista come static final (lst) e aggiungo a questo elenco alcuni elementi.

Quando uso lst.get(i), ottengo errore di compilazione:

The value for annotation attribute must be a constant expression 

Qual è la soluzione per questo problema?

+1

Utilizzare un'espressione costante. –

+0

È possibile pianificare le cose in un modo diverso: http://stackoverflow.com/questions/7814089/how-to-schedule-a-periodic-task-in-java – obesechicken13

risposta

29

Il valore per un'annotazione deve essere una costante di tempo di compilazione, quindi non esiste un modo semplice per eseguire ciò che si sta tentando di fare.

vedi anche qui: How to supply value to an annotation from a Constant java

E 'possibile utilizzare alcuni strumenti in fase di compilazione (formica, Maven?) Per config se il valore è sapere prima si tenta di eseguire il programma.

28

è una limitazione senza senso; solo perché è stato implementato in quel modo non significa che sia la strada giusta. forse potrebbero aver voluto andare in fasi e prima hanno implementato i vincoli di convalida del tempo di compilazione, ma ciò non significa che dobbiamo fermarci lì e prendere in giro la sua inflessibilità.

Penso che sia giunto il momento di aumentare il rumore sulla necessità di convalidare i vincoli del tempo di esecuzione, anche se comporta un piccolo calo di prestazioni. quei vincoli che hanno valori di tempo di compilazione devono essere convalidati utilizzando le implementazioni del validatore di tempo di compilazione e quelli che hanno valori di tempo di esecuzione devono essere convalidati utilizzando le implementazioni del validatore di runtime.

Dovremmo migliorare una richiesta di miglioramento con il comitato di esperti JSR 303 per questa aggiunta di funzionalità o forse questa è una limitazione della funzione di annotazione stessa, quindi la richiesta deve essere inviata al gruppo di esperti JSR-250 se è ancora in vigore .

8

Questo è ciò che una costante espressione in Java assomiglia:

package com.mycompany.mypackage; 

public class MyLinks { 
    // constant expression 
    public static final String GUESTBOOK_URL = "/guestbook"; 
} 

si può utilizzare con le annotazioni come segue:

import com.mycompany.mypackage.MyLinks; 

@WebServlet(urlPatterns = {MyLinks.GUESTBOOK_URL}) 
public class GuestbookServlet extends HttpServlet { 
    // ... 
} 
Problemi correlati