2014-05-12 20 views
24

Esiste un modo per definire variabili finali statiche (costanti efficaci) in una dichiarazione enum Java?Come definire le costanti statiche in un enum Java?

Quello che voglio è quello di definire in un unico luogo il valore letterale di stringa per la BAR (1 ... n) valori:

@RequiredArgsConstructor 
public enum MyEnum { 
    BAR1(BAR_VALUE), 
    FOO("Foo"), 
    BAR2(BAR_VALUE), 
    ..., 
    BARn(BAR_VALUE); 

    private static final String BAR_VALUE = "Bar"; 

    @Getter 
    private final String value; 
} 

ho ottenuto il seguente messaggio di errore per il codice precedente: Non può RIFERIMENTO un campo prima che sia definito.

+2

perché dovresti avere così tante enumerazioni con lo stesso valore? questo sembra totalmente contro l'idioma delle enumerazioni! – Juvanis

+1

Il testo dell'errore è la risposta al tuo problema !! –

+2

@Juvanis: si noti che ogni istanza enum ha il proprio nome univoco, quindi non la considero una violazione degli idiomi dell'enumerazione. Nel mio caso, le istanze di MyEnum fungono da chiavi per una mappa, le quali chiavi devono anche essere inviate a un target esterno. Questi valori di uscita sono uguali in alcuni casi secondo le specifiche. – jilt3d

risposta

33

Come suggerisce IDEA IntelliJ quando si estrae una classe interna statica costante. Questo approccio funziona:

@RequiredArgsConstructor 
public enum MyEnum { 
    BAR1(Constants.BAR_VALUE), 
    FOO("Foo"), 
    BAR2(Constants.BAR_VALUE), 
    ..., 
    BARn(Constants.BAR_VALUE); 



    @Getter 
    private final String value; 

    private static class Constants { 
     public static final String BAR_VALUE = "BAR"; 
    } 
} 
+0

Penso che si dovrebbe notare che @RequiredArgsConstructor proviene dalla libreria lombok. – DaShaun

+0

Anche se questo non funziona per usare le 'costanti' nei valori delle annotazioni. –

-1

Forse si dovrebbe considerare rompere questo enum in due campi: un enum e un int:

@RequiredArgsConstructor 
public enum MyEnum { 
    BAR("Bar"), 
    FOO("Foo") 

    @Getter 
    private final String value; 
} 

e quindi utilizzare:

private MyEnum type; 
private int value; 

(si può mettere che in una classe o no, se ha senso)

Problemi correlati