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吧!

发布了71 篇原创文章 · 获赞 13 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_29611427/article/details/103387515