2012-04-30 20 views

Respuesta

22

Solo puede usar cadenas conocidas en tiempo de compilación. El compilador no puede determinar el resultado de esa expresión.

Tal vez usted puede intentar

String argument = ... 
switch(MyEnum.valueOf(argument)) { 
    case VALUE1: 

    case VALUE2: 
+0

Lo importante es que 'VALUE1' es estático. Podrías tener tu propio 'myValueOf()' y aún así funcionaría. –

+0

Maldición, 'valueOf()' no está en un 'caso' en absoluto. Estoy borrando ese comentario anterior, no puedo verlo. Gracias de nuevo. – Bloke

+3

Tenga cuidado con valueOf() que arroja NPE y IllegalArgumentException si el argumento no es válido. El código de Bloke tiene sentido para evitar manejar estas excepciones (pero lamentablemente no funciona). – Nereis

5

caso MyEnum.VALUE1.toString(): // No es esto igual a "VALUE1"?

No, no necesariamente: usted es libre de proporcionar su propia implementación de toString()

public enum MyType { 
VALUE1 { 
    public String toString() { 
     return "this is my value one"; 
    } 
}, 

VALUE2 { 
    public String toString() { 
     return "this is my value two"; 
    } 
} 

}

Por otra parte, una persona que está manteniendo su código podría agregar esta aplicación después de salir de la empresa . Es por eso que no debe confiar en los valores de cadena, y quedarse con el uso de valores numéricos (representados por las constantes MyEnum.VALUE1, MyEnum.VALUE2, etc.) de su enum s en su lugar.

+0

"valores numéricos de sus enums"? ¿Te refieres a nombres constantes de enumeración de tus enums? – assylias

+0

@assylias Por supuesto, definitivamente me refiero al uso de nombres constantes, ¡literales no enteros que corresponden a estos nombres! Gracias, edité la respuesta para reflejar este punto importante. – dasblinkenlight

+0

Oh, correcto. Esa es una buena explicación, gracias. – Bloke

1

Para añadir a los comentarios de Peter Lawrey, echar un vistazo a this puesto desde el año pasado que discute Puesta en cadena en Java antes y después de JDK7.

+0

Ni siquiera sabía que no era posible antes de JDK7. Gracias, encontré un gran enlace al respecto en un comentario: [link] (http://www.xefer.com/2006/12/switchonstring) - ¿Es esa la mejor manera de procesar la entrada de String? – Bloke

+1

Bueno, un purista podría decir que no debería usar ningún enunciado de interruptor/caja en un lenguaje OOP; en su lugar, debes ir con una estrategia de polimorfismo para tratar con algo como esto.OMI, si es claro, conciso, fácil de mantener y eficiente, un caso/cambio es la mejor solución en muchos escenarios. – Sanjeev

-1

EDIT: Disculpas por una respuesta de C# a una pregunta de Java. No sé qué salió mal allí.

Es es posible utilizar valores de cadena (incluidos los valores de cadena de enumeraciones). Sin embargo, solo puede usar constantes en tiempo de compilación. Está llamando a un método, ToString(), que debe evaluarse en tiempo de ejecución.

A partir de C# 6, puede utilizar esta alternativa constante: case nameof(SomeEnum.SomeValue):

nombredel() se evalúa en tiempo de compilación, simplemente a una cadena que coincide con el nombre (no calificada) de la variable, el tipo o miembro dado . Su valor coincide con el de SomeEnum.ToString().

Cuestiones relacionadas