有没有办法将枚举转换为常量表达式? 我希望我的switch操作符在枚举的值中进行选择,但是我得到了一个编译错误“case表达式必须是常量表达式”,所以我试着在变量中声明它:
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
编译时常量表达式是表示值的表达式 原始类型或不突然完成的字符串,是 仅使用以下内容撰写:
•原始类型的文字和String类型的文字
所以它不起作用,因为我没有使用文字。我想我必须声明为:
final int REG = 8;
但将它与枚举链接起来要好得多。有没有办法做到这一点?
修改
原来我不需要使用任何最终变量。这很简单:
switch (service) {
case REG:
在我看到安德里亚的评论之前,我没有想到。谢谢你的回答。
答案 0 :(得分:6)
如果可能,请修改getIndex()
方法,使其返回枚举而不是整数。如果无法做到这一点,则需要将索引映射到枚举元素:
鉴于以下枚举:
public enum Index {
ONE,
TWO,
THREE
}
您可以使用
将索引映射到枚举元素Index.values()[index]
根据您的方法Integer getIndex()
,您可以执行类似
switch(Index.values()[getIndex()])
case ONE : ...
break;
case TWO : ...
break;
case THREE : ...
break;
}
请注意,如果您尝试访问枚举中大于枚举元素数量的索引,则可能会抛出ArrayIndexOutOfBoundsException
(例如,在上面的示例中,如果getIndex()
返回值&gt ; 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()
是一项昂贵操作的提示,因为每次调用时都需要返回数组的副本。)
答案 1 :(得分: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;
}
}
}