2012-02-14 11 views
17

Sto provando a creare una variabile finale statica privata all'interno di un enum, ma continuo a ricevere un errore di compilazione. Qualcuno sa come risolvere questo problema?Variabile finale statica privata all'interno di un enum

Multiple markers at this line

  • Syntax error, insert "Identifier" to complete EnumConstantHeaderName
  • Syntax error, insert "}" to complete EnumBody
class Foo { 
    ... 

    public enum MyEnum { 
    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor";  

    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 

risposta

20

Le costanti enum devono essere i primi elementi nella enumerazione. Una versione del codice che compila:

class Foo { 

    public enum MyEnum { 
     MyEnumType, MyEnumType2; 

     public String bar() { 
      return MY_STRING; 
     } 

     public String bar2() { 
      return MY_STRING + "2"; 
     } 

     private static final String MY_STRING = "a string I reuse in the enum"; 
    } 
} 

* EDIT *

basato fuori le modifiche apportate alla tua domanda iniziale, vedo ciò che si sta cercando di fare. Non è possibile utilizzare le costanti nelle dichiarazioni letterali enum dichiarate nella definizione enum stessa. Questo perché le dichiarazioni letterali DEVONO essere i primi elementi nell'enumerazione. Questo è richiesto dalla specifica del linguaggio Java. Due cose veloci però:

  1. Si utilizza private static final Strings. Questo ti dà assolutamente nessun vantaggio sull'uso di stringhe letterali invece, che risolverebbe il problema.
  2. Se si desidera dichiarare costanti riutilizzabili (public static final Strings), è necessario farlo all'esterno dello dell'enumerazione.

In alternativa si può dichiarare le enumerazioni come elementi annidati di una classe che definisce l'private static final String s' per voi.

Alcuni pseudocodice:

public class Foo { 
    public static enum MyEnum { 
     MyEnumType(0, MY_STRING), MyEnumType2(1, "Hello"); 

     private int ordinal; 
     private String value; 

     MyEnum(int ordinal, String value) { 
      this.ordinal = ordinal; 
      this.value = value; 
     } 

     public int getOrdinal() { 
      return ordinal; 
     } 

     public String getValue() { 
      return value; 
     } 

     public void setOrdinal(int ordinal) { 
      this.ordinal = ordinal; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 
    } 

    private static final String MY_STRING = "a string I reuse in the enum"; 
} 
+0

Convention dice di mettere i vostri campi sui vostri metodi. –

+1

In realtà sto usando le stringhe nel costruttore. – will

+0

Tom - Cosa intendi con "metti i tuoi campi sui tuoi metodi"? – will

6

interfaccia può essere utilizzato:

class Foo { 
    ... 

    private interface MyEnumConstants { 
    static final String MY_STRING = "a string I use in a constructor"; 
    static final String MY_OTHER_STRING = "a string I use in another constructor";  
    } 

    public enum MyEnum implements MyEnumConstants { 
    MyEnumType(1, MY_STRING), 
    MyEnumType2(2, MY_STRING), 
    MyEnumType3(3, MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 
    } 
... 
} 
+1

È possibile nidificare l'interfaccia all'interno dell'enumerazione se non si desidera contenere entrambi all'interno di un'altra classe. – MithrilTuxedo

19

E 'possibile, basta fare riferimento direttamente alle variabili.

class Foo { 
    ... 

    public enum MyEnum { 

    MyEnumType(1, MyEnum.MY_STRING), 
    MyEnumType2(2, MyEnum.MY_STRING), 
    MyEnumType3(3, MyEnum.MY_OTHER_STRING); 

    MyEnum(int num, String str) { 
     ... 
    } 

    private static final String MY_STRING = "a string I use in a constructor"; 
    private static final String MY_OTHER_STRING = "a string I use in another constructor"; 
    } 
... 
} 
+0

Fantastico! (e strano) – TWiStErRob

+1

Sto ottenendo un riferimento forward illegale con questo, ma sto passando in Patterns compilati. Tuttavia, un'interfaccia nidificata all'interno dell'enum ha funzionato. – MithrilTuxedo

+0

Sembra compilare (stranamente), ma poi in fase di esecuzione ottengo 'java.lang.NoClassDefFoundError: Impossibile inizializzare la classe' – qwertzguy

Problemi correlati