2010-01-14 11 views
106

Sto pensando che questo potrebbe non essere possibile in Java a causa di annotazione ed i suoi parametri vengono risolte al momento della compilazione. Ho un'interfaccia come segue,Come per fornire valore ai un'annotazione da un java Constant

public interface FieldValues { 
    String[] FIELD1 = new String[]{"value1", "value2"}; 
} 

e un'altra classe come,

@SomeAnnotation(locations = {"value1", "value2"}) 
public class MyClass { 
    .... 
} 

ho marchio molte classi con l'annotazione e vorrei sapere se posso evitare di specificare le stringhe in ogni annotazione I sarebbe invece preferisce utilizzare

@SomeAnnotation(locations = FieldValues.FIELD1) 
public class MyClass { 
    .... 
} 

Tuttavia questo dà errori di compilazione come valore annotazioni devono essere un array di inizializzazione ecc qualcuno sa come posso usare una stringa costante o String [] costante per fornire valore a un'annotazione?

risposta

92

Compile costanti can only be primitives and Strings:

15,28.Espressioni costanti

Una fase di compilazione espressione costante è un'espressione che denota un valore di tipo primitivo o una stringa che non completano bruscamente ed è composto utilizzando solo il seguente:

  • letterali di tipo primitivo e letterali di tipo String
  • Getti di tipi primitivi e calchi di digitare String
  • [...] operatori [...]
  • Espressioni parentesi la cui espressione contenuta è un'espressione costante.
  • Nome semplice che si riferisce a variabili costanti.
  • Nomi qualificati del modulo Tipo Nome. Identificatore che fa riferimento a variabili costanti.

realtà in java non c'è modo per proteggere oggetti in un array. A runtime qualcuno può sempre fare FieldValues.FIELD1[0]="value3", quindi l'array non può essere veramente costante se guardiamo più a fondo.

+9

Anche Enums! :) :) – TacB0sS

+2

Penso che l'URL di riferimento sia morto. La specifica Java sulle costanti è a cosa ti riferivi? Ad esempio, http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 –

+0

@ TacB0sS, le enumerazioni non sono espressioni costanti. – jaco0646

5

Qualcuno sa come posso usare un stringa costante o String [] costante di fornire valore ai un'annotazione?

Sfortunatamente, non è possibile farlo con gli array. Con variabili non array, il valore deve essere statico finale.

32

È possibile utilizzare una costante (cioè una variabile statica finale) come parametro per un'annotazione. Come un esempio veloce, io uso qualcosa di simile abbastanza spesso:

import org.junit.Test; 
import static org.junit.Assert.*; 

public class MyTestClass 
{ 
    private static final int TEST_TIMEOUT = 60000; // one minute per test 

    @Test(timeout=TEST_TIMEOUT) 
    public void testJDK() 
    { 
     assertTrue("Something is very wrong", Boolean.TRUE); 
    } 
} 

Si noti che è possibile passare la costante TEST_TIMEOUT direttamente nel annotazione.

Offhand, non ricordo di aver mai provato questo con un array, quindi potresti avere alcuni problemi con lievi differenze nel modo in cui gli array sono rappresentati come parametri di annotazione rispetto alle variabili Java? Ma per quanto riguarda l'altra parte della tua domanda, potresti sicuramente usare una stringa costante senza problemi.

EDIT: Ho appena provato questo con un array di stringhe, e non è stato eseguito nel problema lei ha citato - tuttavia il compilatore ha mi dicono che il "valore di attributo deve essere costante", nonostante la matrice in fase di definizione come public static final String[]. Forse non gli piace il fatto che gli array siano mutabili? Hmm ...

+0

duro fortuna per me! Oh yah sono riuscito a passare stringhe/numeri ma non matrici. Passerò un po 'più di tempo su questo e se non funziona nulla accetterà la risposta :) –

+0

Sì, la mia ipotesi sarebbe che la mutevolezza dell'array FIELD1 sia il problema qui. Sei autorizzato a dichiarare la matrice con un inizializzatore di array perché nient'altro può accedere a quell'array e quindi non può essere modificato in seguito. – ColinD

+0

Questo risolve il mio problema. Serve solo per condividere una costante di stringa tra annotazioni e codice. Grazie! La variabile finale statica – simon

9

Lei non è alimentandolo con una matrice nel tuo esempio. Di seguito compila bene:

public @interface SampleAnnotation { 
     String[] sampleValues(); 
    } 

    public class Values { 
     public static final String v1 = "A"; 
     public static final String v2 = "B"; 

     @SampleAnnotation(sampleValues = { v1, v2 }) 
     public void foo() { 
     } 
    } 
+2

Viene fornito con un array nell'esempio, ma non uno creato direttamente nella dichiarazione di annotazione. – ColinD

5

Penso che questo potrebbe non essere possibile in Java perché l'annotazione ei suoi parametri sono> risolti in fase di compilazione.

Con Seam 2 http://seamframework.org/ è stato possibile risolvere i parametri di annotazione in fase di esecuzione, con linguaggio di espressione tra virgolette.

In Seam 3 questa caratteristica è il modulo Seam Solder http://seamframework.org/Seam3/Solder

Problemi correlati