Java: использование оператора switch с перечислением под подкласс

Сначала я расскажу, что я гораздо лучше знаком с перечислениями на С#, и кажется, что перечисления в java - это довольно беспорядок.

Как вы можете видеть, я пытаюсь использовать оператор switch @enums в следующем примере, но всегда получаю ошибку независимо от того, что я делаю.

Ошибка, которую я получаю:

Квалифицированная метка case SomeClass.AnotherClass.MyEnum.VALUE_A должна быть заменена на неквалифицированную константу перечисления VALUE_A

Дело в том, что я вполне понимаю ошибку, но я не могу просто написать VALUE_A, поскольку перечисление находится в другом подклассе. Есть ли способ решить эту проблему? И почему это происходит на 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;
            }
        }
    }
}

Ответ 1

Измените его так:

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

Ключ находится в ошибке. Вам не нужно квалифицировать метки case с типом перечисления, просто его значение.

Ответ 2

Java автоматически указывает тип элементов в case, поэтому метки должны быть неквалифицированы.

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}

Ответ 3

это должно сделать:

//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;
            }
        }
    }
}

Ответ 4

Напишите someMethod() следующим образом:

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

В операторе switch вы должны использовать только имя константы.

Ответ 5

Вот как я его использую. И он работает фантастически -

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;
        }
    }

И switch-case, как показано ниже

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}