2009-02-11 15 views
39

Właśnie dostałem projekt Java5, który ma ten błąd, próbowałem używać Java5 i Java6, ale nadal tam jest. jakoś działało wcześniej (skoro był w svn), jak mogę ominąć ten błąd kompilatora?Nie można odwoływać się do statycznego pola wyliczeniowego w inicjalizatorze?

+0

to może pomóc, aby opublikować swój kod, który jest erroring – tddmonkey

+0

można podać małą próbkę kodu, co próbujesz osiągnąć? –

+0

Przykro mi to, znalazłem go przez google, ale wydaje się działać, gdy prywatne statyczne pole końcowe jest typem pierwotnym. Czy ktoś ma pomysł, dlaczego? – Norswap

Odpowiedz

70

Nie "pomijaj" błędu - nie zrobi tego, co chcesz. Błąd jest nie bez powodu.

Wartości wyliczeniowe są inicjowane przed innymi statycznymi polami. Jeśli chcesz zrobić coś jak dodanie wszystkich wartości na mapie, zrób to w statycznego inicjatora po wszystkiego:

import java.util.*; 

public enum Foo 
{ 
    BAR, BAZ; 

    private static final Map<String, Foo> lowerCaseMap; 

    static 
    { 
     lowerCaseMap = new HashMap<String, Foo>(); 
     for (Foo foo : EnumSet.allOf(Foo.class)) 
     { 
      // Yes, use some appropriate locale in production code :) 
      lowerCaseMap.put(foo.name().toLowerCase(), foo); 
     } 
    } 
} 
+0

Jon - czy wiesz, dlaczego ten błąd nie występuje w Eclipse 3.3, ale czy w 3.4? – tddmonkey

+3

Czy w powyższym przykładzie są powody używania 'Foo foo: EnumSet.allOf (Foo.class)' zamiast 'Foo foo: Foo.values ​​()'? –

+1

@AbdullahJibaly: Niezupełnie. Sądzę, że są w przybliżeniu równoważne. –

6

inny sposób na „obejście” to, jeśli trzeba na przykład licznik lub coś, co musi działać na każdym initalization, jest stworzenie prywatnej statycznej klasę wewnętrzną, tak jak poniżej:

Powiązane problemy