Uso de cadenas estáticas en la declaración Groovy Switch-Case

Soy un programador de Java que está incursionando en Groovy. Notarás en mi código que mezclo alguna sintaxis específica de Java, que supuestamente está bien con Groovy.

¿Alguien puede explicarme por qué Groovy no acepta una variable estática como CASE ¿parámetro? O si es así, ¿puedes ver lo que estoy haciendo mal aquí?

public static final String HIGH_STRING = "high";
public static final String LOW_STRING  = "low";

... //other code, method signature, etc.

def val = "high";
switch (val) {

   case HIGH_STRING:
     println("string was high"); //this won't match
     break;

   case LOW_STRING:
     println("string was low");  //this won't match
     break;

   //case "high":
   //  println("string was high"); //this will match because "high" is a literal
   //  break;

   default:
     println("no match");
}

... //other code, method closeout, etc.

preguntado el 03 de mayo de 12 a las 15:05

Su caso de prueba funciona para mí. Por favor, publique una prueba completa donde falla. Además, ¿qué versión de Groovy estás usando? -

Ustedes tienen razón. Estoy trabajando en una aplicación de Grails y estoy haciendo esto switch en una clase de servicio. agregué el public static final declaraciones mientras mi aplicación se estaba ejecutando, y Grails parecía estar actualizando las clases en consecuencia. Descubrí que no lo era (curiosamente, solo en esos public static final vars, ya que otros cambios de código estaban tomando). Hice un nuevo reinicio de mi aplicación, y ahora funciona. -

1 Respuestas

Sé que esto no responde a su pregunta de por qué su código no funciona para usted, pero si desea una forma un poco mejor/mejor de implementar su código, puede incluir sus valores en un mapa para que no tenga que usar a switch declaración:

class ValueTests {
    public static final String HIGH_STRING = "high"
    public static final String LOW_STRING  = "low"

    @Test
    void stuff() {
        assert "string was high" == getValue("high")
        assert "string was low" == getValue("low")
        assert "no match" == getValue("higher")
    }

    def getValue(String key) {
        def valuesMap = [
            (HIGH_STRING): "string was high", 
            (LOW_STRING):"string was low"
        ]
        valuesMap.get(key) ?: "no match"
    }

}

Un poco más limpio que un switch OMI.

contestado el 03 de mayo de 12 a las 16:05

esto no es exactamente lo que estaba buscando, pero verán en mi comentario anterior que fue mi propia culpa indiferente que esto no estaba funcionando. Sin embargo, el enfoque interesante que proporcionó aquí, y es lo más cercano que alguien publicó a una respuesta correcta, así que lo aceptaré. Me gusta aprender nuevas formas de abordar estas cosas, ¡así que gracias por tomarse el tiempo! - Marc

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.