前言:今天在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吧!