Java: usando la instrucción switch con enum bajo subclase


Primero diré que estoy mucho más familiarizado con los enums en C# y parece que los enums en Java son un desastre.

Como puedes ver, estoy tratando de usar una instrucción switch @ enums en mi siguiente ejemplo, pero siempre recibo un error sin importar lo que esté haciendo.

El error que recibo es:

La etiqueta de caja calificada SomeClass.AnotherClass.MyEnum.VALUE_A debe ser reemplazada por la constante de enumeración no calificada VALUE_A

La cosa es que yo bastante entiendo el error pero yo no se puede simplemente escribir el VALUE_A ya que la enumeración se encuentra en otra subclase. ¿Hay alguna manera de resolver este problema? ¿Y por qué sucede en Java?

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        MyEnum enumExample //...

        switch (enumExample) {
            case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
                //..
                break;
            }
        }
    }
}
Author: rink.attendant.6, 2012-04-15

5 answers

Cámbialo a esto:

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

La pista está en el error. No necesita calificar las etiquetas case con el tipo de enumeración, solo su valor.

 407
Author: darrengorman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 11:05:13

Java infiere automáticamente el tipo de los elementos en case, por lo que las etiquetas deben ser no calificadas.

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}
 24
Author: Kru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 11:03:53

Esto debería hacer:

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...

        switch (enumExample) {
            case VALUE_A: { //<-- error on this line
            //..
            break;
            }
        }
    }
}
 2
Author: Woyzeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 11:09:04

Escribe someMethod() de esta manera:

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

En la instrucción switch debe usar solo el nombre de la constante.

 0
Author: dash1e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-15 11:07:58

Así es como lo estoy usando. Y está funcionando fantásticamente -

public enum Button {
        REPORT_ISSUES(0),
        CANCEL_ORDER(1),
        RETURN_ORDER(2);

        private int value;

        Button(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

Y el switch-case como se muestra a continuación

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}
 0
Author: Jimit Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 09:30:12