赞
踩
问题记录:
在开发过程当中,需要对一个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;
- }
至此解决报错问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。