用于Java中不同枚举类的联合的switch语句

shu*_*why 2 java enums switch-statement

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

enum Enum1 {ONE, TWO, THREE}
enum Enum2 {FOUR, FIVE}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的方法:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

那么可以切换泛型枚举类型的值吗?


有一种方法可以将其更改为字符串(仅适用于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
    }
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 5

你无法做你想做的事.首先,enum开关实际上是ordinal()枚举开关的简写.因此,即使您可以让开关识别您的"联合枚举"类型,该语句也有重复的case分支.(例如,ONEFOUR两者都具有序数为0)

一种方法可能是将动作本身移动到枚举中.然后,您可以让每种enum类型实现一个通用接口:

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() { . . . }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以实现你的方法来简单地将处理委托给actor:

public void method(Actor actor) {
    if (actor == null) {
         // default action
    } else {
        actor.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)