2009-02-11 14 views
39

Ho appena ottenuto il progetto Java5 che ha questo errore, ho provato ad usare Java5 e Java6, ma è ancora lì. ha funzionato in qualche modo prima (dato che era in svn), come posso ignorare l'errore del compilatore?Impossibile riferirsi al campo enum statico all'interno di un inizializzatore?

+0

potrebbe aiutare a pubblicare il tuo codice che erroring – tddmonkey

+0

potrebbe fornire un esempio di codice piccolo di quello che si sta cercando realizzare? –

+0

Scusate per questo, l'ho trovato tramite google, ma sembra funzionare quando il campo finale statico privato è un tipo primitivo. Qualcuno ha un'idea del perché? – Norswap

risposta

70

Non "bypassare" l'errore - non farà ciò che desideri. L'errore è lì per una buona ragione.

I valori di enum vengono inizializzati prima di qualsiasi altro campo statico. Se si vuole fare qualcosa di simile l'aggiunta di tutti i valori in una mappa, farlo in un inizializzatore statico dopo tutto il resto:

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 - sai perché questo errore non si verifica in Eclipse 3.3 ma in 3.4? – tddmonkey

+3

C'è un motivo nell'esempio sopra per usare 'Foo foo: EnumSet.allOf (Foo.class)' invece di 'Foo foo: Foo.values ​​()'? –

+1

@AbdullahJibaly: Non proprio. Sono praticamente equivalenti qui, penso. –

6

Un altro modo per "by-pass" che, se avete bisogno per esempio un contatore o qualcosa che deve essere eseguito su ogni inizializzazione del, è quello di creare una classe interna statica privata, in questo modo:

Problemi correlati