Java:在子类下使用带有枚举的switch语句

时间:2012-04-15 10:59:38

标签: java enums switch-statement

首先我要说明我对C#中的枚举更熟悉,看起来java中的枚举很糟糕。

正如您所看到的,我正在尝试在下一个示例中使用switch语句@ enums,但无论我在做什么,我总是会收到错误。

我收到的错误是:

  

必须使用不合格的枚举常量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;
            }
        }
    }
}

7 个答案:

答案 0 :(得分:475)

将其更改为:

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

线索出现错误。您无需使用枚举类型限定case标签,只需使用其值。

答案 1 :(得分:29)

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
}

答案 2 :(得分:2)

这应该做:

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

答案 3 :(得分:1)

Java 14 开始,可以使用 switch 表达式。

对于这篇文章

public enum MyEnum {
    VALUE_A, VALUE_B;
}
public void someMethod() { 
    MyEnum enumExample //...

    switch (enumExample) {
        case VALUE_A -> {
            // logic
        }
        case VALUE_B -> {
            // logic
        }   
    }
}

切换表达式

<块引用>

与所有表达式一样,switch 表达式的计算结果为单个值并可在语句中使用。它们可能包含“case L ->”标签,无需使用 break 语句来防止失败。您可以使用 yield 语句来指定 switch 表达式的值。

public enum Month {
    JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC;
}

示例 1:返回值。

public static int getNoOfDaysInAMonth(Month month, boolean isLeapYear) {
    return switch(month) {
        case APR, JUN, SEP, NOV -> 30;
        case FEB -> (isLeapYear)? 29: 28;
        case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
    };
}

示例 2:不返回值。

public static void printNoOfDaysInAMonth(Month month, boolean isLeapYear) {
    switch(month) {
        case APR, JUN, SEP, NOV -> {
            System.out.println("30 days");
        }
        case FEB -> {
            System.out.println(((isLeapYear)? 29: 28) + " days");
        }
        case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> {
            System.out.println("31 days");
        }
    };
}

参考

Switch Expressions

答案 4 :(得分:0)

以这种方式写someMethod()

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

在switch语句中,您必须仅使用常量名称。

答案 5 :(得分:0)

这就是我使用它的方式。它的工作非常出色 -

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

答案 6 :(得分:0)

错误:

case AnotherClass.MyEnum.VALUE_A

右:

case VALUE_A: