2013-05-08 107 views
6

有什么方法可以将枚举转换为常量表达式? 我希望我的开关操作,以枚举值中进行选择,但我得到一个编译错误“CASE表达式必须是常量表达式”,所以我试图将它声明一个变量:Enum的常量表达式

final int REG = MyEnum.REG.getIndex().intValue(); 

switch (service.getIndex()) { 

case REG: 

但我仍然得到相同的错误。根据Oracle的文档http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

编译时常量表达式是一个表达式表示原始类型或字符串的值 不突然完成并是 仅使用由下列:

•字面原始类型和文字类型字符串

所以它不工作,因为我没有使用文字。我想我将不得不声明它:

final int REG = 8; 

但它将是更好的链接到枚举。有没有办法做到这一点?

编辑

原来我不需要使用任何最终的变量。它就这么简单:

switch (service) { 

case REG: 

直到我看到安德烈的评论,我才没有想到它。感谢您的回答。

+1

我假定'service.getIndex()''返回整数',对吗?你可以修改它,让它返回你的枚举? – 2013-05-08 10:35:25

+1

直到Java 1.6,你不能在'switch-case'中使用'String',但你可以在Java 7中使用它。FYI – Joshi 2013-05-08 10:37:21

回答

6

如果可能,请修改您的getIndex()方法,使其返回枚举而不是整数。如果这是不可能的,你需要地图索引来枚举元素:

给出下面的枚举:使用

Index.values()[index] 

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

您可以将索引映射到一个枚举元素

鉴于你的方法Integer getIndex(),然后你可以做这样的事情

switch(Index.values()[getIndex()]) 
    case ONE : ... 
     break; 

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 

请注意,如果您尝试访问大于枚举元素数的枚举中的索引(例如,枚举),则可能会抛出ArrayIndexOutOfBoundsException。在上面的示例中,如果getIndex()返回值> 2)。


我将封装表达Index.values()[getIndex()]到像valueOf(int index),类似于默认valueOf(String s)枚举方法。然后您可以在那里处理有效的数组索引检查(例如,如果索引超出范围,则返回一个特殊的枚举值)。同样,您可以也转换有特殊含义的离散值:

public enum Index { 
    ZERO, 
    ONE, 
    TWO, 
    THREE, 
    REG, 
    INVALID; 


    public static Index valueOf(int index) { 

     if (index == 8) { 
      return REG; 
     } 

     if (index >= values().length) { 
      return INVALID; 
     } 

     return values()[index]; 
    } 
} 

这只是一个例子 - 在任何情况下,这通常取决于你从你的getIndex()方法得到的值的范围,以及如何你想将它们映射到枚举元素。

然后,您可以使用它像

switch(Index.valueOf(service.getIndex())) { 
    case ZERO : ... break; 
    ... 
    case REG : ... break; 
    ... 
} 

又见Cast Int to enum in Java了一些额外的信息(尤其是暗示values()是昂贵的操作,因为它需要每次都返回数组的副本它叫做)。

+0

它对我很有用!非常感谢! – Mauker 2015-07-14 15:13:04

2

如果你想分配给枚举constacts具体数值是这样的

enum MyReg { 
    REG(8), OTHER(13); 

    public final int value; 
    MyReg(int value) { 
     this.value=value; 
    } 
} 

然后使用它是这样的:

class Test { 
    public static void main(String[] args) { 
     MyReg reg = MyReg.REG; 
     switch (reg) { 
     case OTHER: 
      System.out.println(reg.value); 
      break; 
     case REG: 
      System.out.println(reg.value); 
      break; 
     } 
    } 
}