java枚举类在switch中的总结(Constant expression required以及An enum switch case label must be the unqualif报错..)

前言:今天在switch(switch尽量少用,switch都可以用策略模式来替代,我只是想偷个懒。。)中用枚举类的时候,连报两个错,而且是编译都没通过的那种,哎,记录一下解决过程,由于深知个人比较啰嗦,所以一般都会写上问题原因,思考过程,以及解决方案,如果着急的兄弟们可以直接看解决方案。

 

第一个编译错误:Constant expression required,代码如下:

switch (meter.getBillingWay().toString()) {
       case SewageStrageEnum.SEWAGE_STRAGE_01.getValue(): 
            paymentNotice = sewageMeterStratergy01.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       case SewageStrageEnum.SEWAGE_STRAGE_02.getValue():
            paymentNotice = sewageMeterStratergy02.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       default:
            return;
}

报错位置在:SewageStrageEnum.SEWAGE_STRAGE_01.getValue(),这一行代码。

原因:由于是编译报错,因此我们可以想到switch里的case是否需要的是一个常量(即在编译期就可以确定的值),想通这里之后,我们就不难想到报错的原因了,虽然我们可以通过在枚举类中定义的getValue()方法去获取对应的值,但是这并不是明确的(需要执行方法后才能确定对应的值),java需要明确这个值是在编译期间就能够确定的,而不是在运行时(代码执行过程中)去确定。

解决思路:了解到问题的原因之后,解决思路其实很简单,我们就把case中的值传能在编译期就能确定的值就行了。

解决方法:我们可以在枚举类里加一个通过value得到枚举常量的方法,然后case里面直接写上枚举常量就可以了,代码如下(当然,以下代码也存在问题,也就是第二个编译错误):

switch (SewageStrageEnum.get(meter.getBillingWay().toString())) {
       case SewageStrageEnum.SEWAGE_STRAGE_01: 
            paymentNotice = sewageMeterStratergy01.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       case SewageStrageEnum.SEWAGE_STRAGE_02:
            paymentNotice = sewageMeterStratergy02.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       default:
            return;
}


//枚举类里加个方法
public static SewageStrageEnum get(String value){
    for (SewageStrageEnum sewageStrageEnum : SewageStrageEnum.values()) {
        if (sewageStrageEnum.getValue().equals(value)) {
            return sewageStrageEnum;
        }
    }
    return null;
}

第二个编译错误:An enum switch case label must be the unqualified name of an enumeration constant,代码如上所示:

报错位置还是在:SewageStrageEnum.SEWAGE_STRAGE_01,这一行代码。

原因:他大爷的,这个错误我个人能力有限确实分析不出来了,百度上查了一查,摘抄一下别人的结论:“枚举类型和switch case一起使用时一定不要限定枚举常量值的常量,也就是它的类型。”,意思就是case里面不用在加上枚举类了(或者说是编译器直接帮我们省了,编译器自己就能找到具体是哪一个枚举类),直接写枚举常量就行了。

解决方法:直接上代码,注意看case后面的变化,如下所示:

switch (SewageStrageEnum.get(meter.getBillingWay().toString())) {
       case SEWAGE_STRAGE_01: 
            paymentNotice = sewageMeterStratergy01.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       case SEWAGE_STRAGE_02:
            paymentNotice = sewageMeterStratergy02.handle(meter, startDate, endDate);
            paymentNoticeList.add(paymentNotice);
            break;
       default:
            return;
}

总结:能不用switch还是别用switch吧!

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个有理想的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值