2011-12-05 129 views
18

Im trabajando en java, he creado una enumeración de la siguiente manera:Elementos enum de Java con espacios?

public enum myEnum 
{ 
    india, 
    russian, 
    england, 
    north America 
} 

El ejemplo de arriba da errores durante el uso de espacio en el nombre del elemento (es decir, América del Norte). ¿Alguna sugerencia de cómo resolver el problema anterior?

+1

El acceso a este miembro tampoco sería posible; pensar en 'myEnum x = myEnum.north America'. Estos no serán cumplibles porque si uno permite tales nombres, ¿dónde establecer el final de un identificador? Tal vez la próxima línea de código o declaración debe ser incluida? – Matten

+1

¡NO use letras minúsculas para las enumeraciones e incluso para el nombre de la clase! – banterCZ

Respuesta

52

No puede poner un espacio en medio de un identificador.

Al hacerlo termina ese identificador y el analizador asume que lo que viene a continuación es un token válido en el contexto de esa declaración. Hay pocos (si los hay) lugares que serían legales.

nombres de valor convencional de Java serían:

propiedades
INDIA,   // Or India, 
RUSSIA,  //  Russia, 
NORTH_AMERICA; //  NorthAmerica; 

Un enum pueden tener asociados, como nombres legibles por humanos, por ejemplo,

public enum CountryAndOneContinent { 

    INDIA("India"), 
    RUSSIA("Russia"), 
    NORTH_AMERICA("North America"); 

    private String displayName; 

    CountryAndOneContinent(String displayName) { 
     this.displayName = displayName; 
    } 

    public String displayName() { return displayName; } 

    // Optionally and/or additionally, toString. 
    @Override public String toString() { return displayName; } 
} 

estoy ambivalente sobre el uso de toString para proporcionar representaciones de capa de presentación.

Prefiero que los métodos comuniquen explícitamente su propósito – es más expresivo y obvio.

toString es bastante genérico, y permite solo una única representación. Es posible que se requieran formatos de salida múltiples según el contexto, los parámetros, etc. que toString no permita.

Las ventajas de toString incluyen el uso de operaciones de cadena predeterminadas en el objeto, y en este caso, utilizando valueOf para traducir directamente de la versión legible para el ser humano al valor enum.

+2

Es posible que desee un nombre diferente al nombre ... (Solo un elemento en el OP es un país real. Un país, un idioma, un país constituyente y un continente. Completamente una enumeración.) –

+2

+1 por mencionar el problema con 'toString()'. Por supuesto, puede agregar un método 'getDisplayName()' en lugar de usar 'toString()'. – Jesper

+0

@Jesper Sí, supongo que para cosas que parecen específicamente para 'getXxx' - Lo dejé sin JavaBeany. –

3

Escríbelos juntos como northAmerica o use un guión bajo north_America.

+0

Gracias Tudor, pero no quiero hacer lo anterior como dijiste. Necesito mantener esas palabras separadas. – BSalunke

+3

@BSalunke No puedes. Sin embargo, podrías crear un 'enum' con un valor. Ver actualización –

+2

Solo para enfatizar lo que dice Dave Newton: No se puede, simplemente no funciona de esa manera. – Tudor

1
public enum myEnum 
{ 
    india, 
    russian, 
    england, 
    north_america 
} 

Para los valores de acceso

myEnum.values() 
+0

¡NO use letras minúsculas para las enumeraciones e incluso para el nombre de la clase! – banterCZ

+0

@banterCZ sic erat scriptum –

2

El Java naming rule no permite espacios en blanco como posibles caracteres en un nombre de variables, clases, enumeraciones y miembros de enumeración (y cualquier otro identificador). Por lo tanto, este "problema" no se puede resolver. ¡Simplemente use `north_america 'como nombre de miembro!

An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter.

The Java letters include uppercase and lowercase ASCII Latin letters A-Z (\u0041-\u005a), and a-z (\u0061-\u007a), and, for historical reasons, the ASCII underscore (_, or \u005f) and dollar sign ($, or \u0024). The $ character should be used only in mechanically generated source code or, rarely, to access preexisting names on legacy systems.

The "Java digits" include the ASCII digits 0-9 (\u0030-\u0039).

+0

Es un error de sintaxis, puede escribir un código compilable sin seguir la convención. –

+0

No soy un hablante nativo de inglés, pero para mi comprensión debería llamarse convención :-) – Matten

+0

'public enum myEnum' aquí no está siguiendo la convención. Pero 'north America' es un error de sintaxis y no se compilará. –

4

El problema no tiene nada que ver (específicamente) con las enumeraciones: en Java, los nombres no pueden tener espacios. Intente eliminar el espacio (usando mayúsculas para diferenciar los bits) o use guiones bajos en su lugar.

14

Estoy listo para adivinar por qué quieres un espacio en el nombre; porque quieres referenciarlo como una cadena.

Así que hacer esto:

public enum MyEnum { 
    INDIA("India"), 
    RUSSIAN("Russian"), 
    ENGLAND("England"), 
    NORTH_AMERICA("North America");  

    private String name; 

    MyEnum(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    }  
} 

Se puede considerar la cadena de primer orden.

public toString() { 
    return name; 
} 

Una ventaja de toString primordial() es que esta cadena también se puede utilizar en MyEnum .valueOf (miCadena). Por lo tanto, la anulación de toString básicamente crea un HashMap de los valores enum.

+2

A menos que mssing algo, este ejemplo no funciona en Java 8; 'MyEnum.valueOf (" North America ")' y 'MyEnum.valueOf (MyEnum.NORTH_AMERICA.toString())' arrojan el mismo error: 'IllegalArgumentException No hay constante enum ofi.devops.cmwf.model.trigger.MyEnum.North América' – raffian

1

solo haga su propia función valueOf like en su clase enum. Reemplace los espacios con guiones bajos. nombre sus constantes enum como esta "north_america (" North America ")". Si el método no puede encontrar su enumeración, simplemente devuelve el parámetro.

public static String valueOfOrDefault(String myValue) { 
//replace space with underscore so it matches enum name 
     String value=myValue.toUpperCase().replaceAll("\\s", "_"); 
     for(myEnum type : myEnum.class.getEnumConstants()) { 
      if(type.name().equalsIgnoreCase(value)) { 
      return type.toString(); 
      } 
     } 
     return myValue; 
     } 
0

También introduje un método propio valueOf. Pero vuelvo con Enum Type y no tengo que convertir el "checkString"

checkString es "Caja chica" por ejemplo.

Tipo de publicación journalType = JournalType.valueOfOrDefault (checkString);

public enum JournalType { 

MISC_BILLING("Misc Billing"), 
MISC_BILLING_AUTONUM("Misc Billing AutoNum"), 
PRETTY_CASH("Petty Cash"), 
RECURRING_AP("Recurring AP"), 
GL_JOURNAL("GL Journal"), 
GDS_NDS("GDS/NDS"); 

private final String journalType; 

JournalType(String journalType) { 
    this.journalType = journalType; 
} 

@Override 
public String toString() { 
    return journalType; 
} 

public static JournalType valueOfOrDefault(String myValue) { 
    for(JournalType type : JournalType.class.getEnumConstants()) { 
     if(type.toString().equals(myValue)) { 
      return type; 
     } 
    } 
    throw new IllegalArgumentException("JournalType not found"); 
} 

}