gpt4 book ai didi

java - 枚举中的常量表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:20 27 4
gpt4 key购买 nike

有什么方法可以将枚举转换为常量表达式吗?我希望我的 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

A compile-time constant expression is an expression denoting a value of primitive type or a String that does not complete abruptly and is composed using only the following:

•Literals of primitive type and literals of type String

所以它不起作用,因为我没有使用文字。我想我必须将其声明为:

final int REG = 8;

但将其链接到枚举会更好。有什么办法吗?

编辑

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

switch (service) {

case REG:

直到我看到 Andrea 的评论,我才想到。感谢您的回答。

最佳答案

如果可能,请修改您的 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;
}

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


我会将表达式 Index.values()[getIndex()] 封装到一个像 valueOf(int index) 这样的枚举方法中,类似于默认的 valueOf(字符串 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() 是一个昂贵的操作,因为它需要在每次调用时返回数组的副本)。

关于java - 枚举中的常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16438306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com