来自Enum的常量表达式

时间:2013-05-08 10:27:40

标签: java compile-time-constant

有没有办法将枚举转换为常量表达式? 我希望我的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:

在我看到安德里亚的评论之前,我没有想到。谢谢你的回答。

2 个答案:

答案 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;
        }
    }
}