当前位置:   article > 正文

枚举类在switch...case语句中使用的问题_switch的case值不能是个枚举值 java

switch的case值不能是个枚举值 java

问题记录:

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

  1. //报错代码:
  2. Integer i = 0;
  3. switch (i) {
  4. case TransactType.TRANSACTTYPE_RECHARGE.getRetCode():
  5. // TODO
  6. break;
  7. case TransactType.TRANSACTTYPE_CASH.getRetCode():
  8. // TODO
  9. break;
  10. default:
  11. break;
  12. }

  1. //枚举类:
  2. public static enum TransactType {
  3. TRANSACTTYPE_RECHARGE(0,"充值"),
  4. TRANSACTTYPE_CASH(1,"提现"),
  5. ;
  6. private Integer retCode;
  7. private String retMsg;
  8. TransactType(Integer retCode,String retMsg){
  9. this.retCode = retCode;
  10. this.retMsg = retMsg;
  11. }
  12. public Integer getRetCode() {
  13. return retCode;
  14. }
  15. public String getRetMsg() {
  16. return retMsg;
  17. }
  18. public static TransactType getByValue(Integer value){
  19. for(TransactType transactType : values()){
  20. if (transactType.getRetCode() == value) {
  21. return transactType;
  22. }
  23. }
  24. return null;
  25. }
  26. }


问题分析:

switch...case语句的case后面的值必须为常量,因为switch在编译的时候需要确保case里面的值必须不能相同。
比如不能出现:
case 5:
case 5:
这种情况。所以case里面的变量必须声明成final类型,并且不能相同。



问题解决:

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

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

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

  1. Integer i = 0;
  2. switch (TransactType.getByValue(i)) {
  3. case TRANSACTTYPE_RECHARGE:
  4. // TODO
  5. break;
  6. case TRANSACTTYPE_CASH:
  7. // TODO
  8. break;
  9. default:
  10. break;
  11. }
至此解决报错问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/729085
推荐阅读
相关标签
  

闽ICP备14008679号