java - Java 中不同枚举类联合的 switch 语句

标签 java enums switch-statement

我有两个枚举类,比如 Enum1 和 Enum2:

enum Enum1 {ONE, TWO, THREE}
enum Enum2 {FOUR, FIVE}

我有这样的方法:

public <E extends Enum<E>> method (E arg) {
    switch (arg) {    // Here is the compile error -- Cannot switch
                      // on a value of type E. Only convertible int
                      // values, strings or enum variables are permitted

                      // (And of course, all the cases are incorrect
                      // because the enum set is unknown)
        case ONE:
            // do something
        case TWO:
            // do something
        case THREE:
            // do something
        case FOUR:
            // do something
        case FIVE:
            // do something
        default:
            // do something
    }
}

那么是否可以切换通用枚举类型的值?


有一种方法可以将其更改为字符串(仅适用于 JDK7):

public <E extends Enum<E>> method (E arg) {
    switch (arg.name()) {
        case "ONE":
            // do something
        case "TWO":
            // do something
        case "THREE":
            // do something
        case "FOUR":
            // do something
        case "FIVE":
            // do something
        default:
            // do something
    }
}

最佳答案

你不能做你想做的事。一方面,enum 开关实际上是枚举的 ordinal() 开关的简写。因此,即使您可以让开关识别您的“联合枚举”类型,该语句也有重复的 case 分支。 (例如,ONEFOUR 的序号都是 0。)

一种方法可能是将操作移至枚举本身。然后,您可以让每个 enum 类型实现一个通用接口(interface):

interface Actor {
    void doSomething();
}

enum Enum1 implements Actor {
    ONE {
        public void doSomething() { . . . }
    },
    TWO {
        public void doSomething() { . . . }
    },
    THREE {
        public void doSomething() { . . . }
    }
}

enum Enum2 implements Actor {
    FOUR {
        public void doSomething() { . . . }
    },
    FIVE {
        public void doSomething() { . . . }
    }
}

然后您可以实现您的方法来简单地将处理委托(delegate)给参与者:

public void method(Actor actor) {
    if (actor == null) {
         // default action
    } else {
        actor.doSomething();
    }
}

关于java - Java 中不同枚举类联合的 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958754/

相关文章:

C - Switch 语句与员工薪酬的 If 语句?

java - 为什么递归调用打印 '123456' 而不是 '1' ?

java - 获取一年的日期的Util

mysql - 设置枚举字段的索引

java - 如何使用 Switch 语句设置 ImageIcon

java - Android:Error - Case 表达式必须是常量表达式

java - 基于模块化Spring的应用程序

java - List<Long> 在 Java 中未序列化为 String

ios - 为什么 switch 语句中不允许使用 `case self > 0: return .positive`

swift - 将多个枚举与单个 guard 案例匹配?