1. 问题描述
今天在代码中想对Java switch case 和枚举类型Enum对象进行联合使用,但发现有Eclipse中异常提示信息:case expressions must be constant expressions,导致编译始终过不去。
枚举类型定义如下:
public enum TradeStatus { CLOSE(-1, "已关闭"), NO_TRADE(0, "未创建"), CREATE(1, "拍下"), PAY(2, "已付款"), SHIP(3, "已发货"), SUCCESS(4, "已完成"); private int value; private String name; private TradeStatus(int value, String name) { this.setValue(value); this.setName(name); } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static TradeStatus getByValue(int value) { for (TradeStatus tradeStatus : values()) { if (tradeStatus.getValue() == value) { return tradeStatus; } } return null; } }
使用代码入下:
private String getStatusDesc(Integer tradeStatus) { switch(tradeStatus){ case TradeStatus.CREATE.getValue() : break; default: break; } return "交易状态"; }
扫描二维码关注公众号,回复:
579479 查看本文章
2. 原因分析
本意是想对tradeStatus值进行分类过滤,但由于 TradeStatus.CREATE.getValue() 返回值是一个变量不符合Java switch case的语法,导致报错。
接下来修改了代码,如下:
private String getStatusDesc(Integer tradeStatus) { switch (TradeStatus.getByValue(tradeStatus)) { case OrderInfoSearchDO.TradeStatus.CREATE: break; default: break; } return "交易状态"; }
但Eclipse继续提示错误信息:The qualified case label TradeStatus.CREATE must be replaced with the unqualified enum constant CREATE。。。
百思不得其解。
3. 问题解决
把枚举常量前的冗余类信息去掉即可,如下所示:
private String getStatusDesc(Integer tradeStatus) { switch (TradeStatus.getByValue(tradeStatus)) { case CREATE: break; default: break; } return "交易状态"; }