2012-02-14 9 views
17

Estoy tratando de crear una variable final estática privada dentro de una enumeración, pero sigo obteniendo un error de compilación. ¿Alguien sabe cómo arreglar esto?variable final privada estática dentro de una enumeración

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) { 
     ... 
    } 
    } 
... 
} 

Respuesta

20

Las constantes enum deben ser los primeros elementos en la enumeración. Una versión de su código que 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"; 
    } 
} 

* * EDITAR

ediciones hechas con sede fuera a su pregunta original, veo lo que está tratando de hacer. No, no es posible usar constantes en las declaraciones literales enum que se declaran en la definición enum. Esto se debe a que las declaraciones literales DEBEN ser los primeros elementos en la enumeración. Esto es obligatorio por la Especificación del lenguaje Java. Dos cosas rápidas:

  1. Está utilizando private static final Strings. Esto le da absolutamente ningún beneficio sobre el uso de literales de cadena en su lugar, que resolvería el problema.
  2. Si desea declarar constantes reutilizables (public static final Strings), deberá hacerlo fuera de de la enumeración.

Alternativamente, usted puede declarar las enumeraciones como elementos anidados de una clase que define el private static final String 's para usted.

Algunos pseudocódigo:

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

La convención dice que ponga sus campos sobre sus métodos. –

+1

En realidad estoy usando las cadenas en el constructor. – will

+0

Tom - ¿Qué quiere decir con "poner sus campos sobre sus métodos"? – will

6

interfaz se puede utilizar:

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

Puede anidar la interfaz dentro de la enumeración si no desea tener que contener ambas dentro de otra clase. – MithrilTuxedo

19

Es posible, sólo hay que hacer referencia directamente a las variables.

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

¡Impresionante! (y raro) – TWiStErRob

+1

Obtengo una referencia hacia delante ilegal con esto, pero en su lugar paso patrones compilados. Sin embargo, una interfaz anidada dentro de la enumeración hizo el truco. – MithrilTuxedo

+0

Parece que se compila (extrañamente) pero luego en tiempo de ejecución obtengo 'java.lang.NoClassDefFoundError: no se pudo inicializar la clase' – qwertzguy

Cuestiones relacionadas