在switch-case语句中使用Enum的序数值

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)


Boz*_*zho 5

首先,您不应该过多地依赖序数。如果可能,将变量String设为a (然后转换为enumusing Enum.valueOf(string)或使其最佳化enum

如果确实不能使用,请使用enum.values()[ordinal]。然后使用开关中的枚举。