您的位置:首页 > 其它

枚举类在switch...case语句中使用的问题

2017-11-07 16:51 246 查看
问题记录:

在开发过程当中,需要对一个Integer的值进行switch操作,case的值是枚举类型的retCode属性(该属性为Integer类型),编译器报错case expressions must be constant expressions。

//报错代码:
Integer i = 0;
switch (i) {
case TransactType.TRANSACTTYPE_RECHARGE.getRetCode():
// TODO
break;
case TransactType.TRANSACTTYPE_CASH.getRetCode():
// TODO
break;
default:
break;
}

//枚举类:
public static enum  TransactType {

TRANSACTTYPE_RECHARGE(0,"充值"),
TRANSACTTYPE_CASH(1,"提现"),
;

private Integer retCode;
private String retMsg;

TransactType(Integer retCode,String retMsg){
this.retCode = retCode;
this.retMsg = retMsg;
}

public Integer getRetCode() {
return retCode;
}

public String getRetMsg() {
return retMsg;
}

public static TransactType getByValue(Integer value){
for(TransactType transactType : values()){
if (transactType.getRetCode() == value) {
return transactType;
}
}
return null;
}
}


问题分析:

switch...case语句的case后面的值必须为常量,因为switch在编译的时候需要确保case里面的值必须不能相同。

比如不能出现:

case 5:

case 5:

这种情况。所以case里面的变量必须声明成final类型,并且不能相同。

问题解决:

解决思路:根据需要switch的值获取对应具体的枚举类,对获取到的枚举类进行switch...case。

在TransactType枚举类中定义一个方法:

public static TransactType getByValue(Integer value){
for(TransactType transactType : values()){
if (transactType.getRetCode() == value) {
return transactType;
}
}
return null;
}
把报错代码的枚举类使用方式作改变,变成以下代码:

Integer i = 0;
switch (TransactType.getByValue(i)) {
case TRANSACTTYPE_RECHARGE:
// TODO
break;
case TRANSACTTYPE_CASH:
// TODO
break;
default:
break;
}
至此解决报错问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐