Dok*_*rNo 9 java enums switch-statement
对于我的项目,我使用枚举,我需要实现switch-case语句,其中检查特定Enum的序数值,如下所示:
switch ( variable )
{
case MyEnum.A.ordinal():
return true;
case MyEnum.B.ordinal():
return true;
default:
return false;
}
Run Code Online (Sandbox Code Playgroud)
注意:返回值只是一个示例.
不幸的是,Eclipse(我使用1.6 JDK)给出了我的编译错误"case表达式必须是常量表达式".我该做什么?除了静态查找表之外是否还有其他方法,如下所述:从枚举序号转换为枚举类型?
bes*_*sss 18
这是如何完成的,前提是你在某处某处有序列化顺序.通常,坚持枚举的方式是它的名字,而不是顺序.除非尝试实现类似EnumMap/Set之类的东西,否则你不应该在正常情况下使用序数.当然,枚举可以只是来自C类似东西的端口并处理不可避免的int,需要转换为Enum对象.
只是Enum.values()用来获取一个排序的数组ordinal(),因为每次克隆数组,保持ref是可以的.
enum E{
A, B, C...
}
final static E[] vals = E.values();//copy the values(), calling values() clones the array
boolean f(int variable){
switch(vals[variable]){
case A:
...
case B:
...
//break;
default:
...
}
}
Run Code Online (Sandbox Code Playgroud)
刚刚注意到你只需要真假,那就是Set类型的行为.您可以使用java.util.EnumSet或简单long,如果感觉勇敢(并且没有超过64个枚举常量).例如:
private static <E extends Enum> long ord(E e){
return 1L<<e.ordinal();
}
static final long positiveSet = ord(E.A)+ord(E.B);
boolean f(int ordinal){
return 0!=(positiveSet&(1L<<ordinal));
}
Run Code Online (Sandbox Code Playgroud)
首先,您不应该过多地依赖序数。如果可能,将变量String设为a (然后转换为enumusing Enum.valueOf(string)或使其最佳化enum。
如果确实不能使用,请使用enum.values()[ordinal]。然后使用开关中的枚举。