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)
你无法做你想做的事.首先,enum开关实际上是ordinal()枚举开关的简写.因此,即使您可以让开关识别您的"联合枚举"类型,该语句也有重复的case分支.(例如,ONE和FOUR两者都具有序数为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)
| 归档时间: |
|
| 查看次数: |
1529 次 |
| 最近记录: |