2014-05-12 15 views
24

Czy istnieje sposób definiowania statycznych zmiennych końcowych (skutecznie stałych) w deklaracji enum Java?Jak zdefiniować statyczne stałe w wyliczeniu Java?

Co chcę jest zdefiniowanie w jednym miejscu wartość ciągiem znaków na pasek (1 ... n) wartości:

@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; 
} 

mam następujący komunikat o błędzie dla powyższego kodu: Nie można odwoływać pole, zanim zostanie zdefiniowane.

+2

dlaczego miałbyś tyle wyrażeń o tej samej wartości? wydaje się to całkowicie sprzeczne z idiomem wyliczenia! – Juvanis

+1

Tekst błędu jest odpowiedzią na Twój problem !! –

+2

@Juvanis: zauważ, że każda instancja wyliczenia ma własną unikalną nazwę, więc nie uważam tego za naruszenie wobec idiomów wyliczeniowych. W moim przypadku instancje MyEnum działają jako klucze do mapy, które klucze również chcę wyprowadzić na zewnętrzny cel. Te wartości wyjściowe są w niektórych przypadkach takie same, zgodnie ze specyfikacją. – jilt3d

Odpowiedz

33

Jak sugeruje IntelliJ IDEA przy wyodrębnianiu stałej - utwórz statyczną klasę wewnętrzną. To podejście działa:

@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

Myślę, że należy zauważyć, że @RequiredArgsConstructor jest z biblioteki lombok. – DaShaun

+0

Mimo że ten nie działa, aby użyć "stałych" w wartości adnotacji. –

-1

Może powinieneś rozważa złamanie tego wyliczenia w dwóch obszarach: enum i int:

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

    @Getter 
    private final String value; 
} 

a następnie użyć:

private MyEnum type; 
private int value; 

(można umieścić, że w klasie, czy nie, czy ma to dla ciebie sens)

Powiązane problemy