1700446167
1700446168
}
1700446169
1700446170
由于把所有的枚举项都列举完了,不可能有其他值,所以就不需要default代码块了,这是普遍的认识,但问题是我们的switch代码与枚举之间没有强制约束关系,也就是说两者只是在语义上建立了联系,并没有一个强制约束,比如LogLevel枚举发生改变,增加了一个枚举项FATAL,如果此时我们对switch语句不做任何修改,编译虽不会出现问题,但是运行期会发生非预期的错误:FATAL类型的日志没有输出。
1700446171
1700446172
为了避免出现这类错误,建议在default后直接抛出一个AssertionError错误,其含义就是“不要跑到这里来,一跑到这里就会出问题”,这样可以保证在增加一个枚举项的情况下,若其他代码未修改,运行期马上就会报错,这样一来就很容易查找到错误,方便立刻排除。
1700446173
1700446174
当然也有其他方法解决此问题,比如修改IDE工具,以Eclipse为例,可以把Java→Compiler→Errors/Warnings中的“Enum type constant not covered on’switch’”设置为Error级别,如果不判断所有的枚举项就不能通过编译。
1700446175
1700446176
1700446177
1700446178
1700446180
编写高质量代码:改善Java程序的151个建议 建议87:使用valueOf前必须进行校验
1700446181
1700446182
我们知道每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode、name、valueOf等,其中valueOf方法会把一个String类型的名称转变为枚举项,也就是在枚举项中查找出字面值与该参数相等的枚举项。虽然这个方法很简单,但是JDK却做了一个对于开发人员来说并不简单的处理。我们来看代码:
1700446183
1700446184
public static void main(String[]args){
1700446185
1700446186
//注意summer是小写
1700446187
1700446188
List<String>params=Arrays.asList(“Spring”,“summer”);
1700446189
1700446190
for(String name:params){
1700446191
1700446192
//查找字面值与name相同的枚举项
1700446193
1700446194
Season s=Season.valueOf(name);
1700446195
1700446196
if(s!=null){
1700446197
1700446198
//有该枚举项时
1700446199
1700446200
System.out.println(s);
1700446201
1700446202
}else{
1700446203
1700446204
//没有该枚举项
1700446205
1700446206
System.out.println(“无相关枚举项”);
1700446207
1700446208
}
1700446209
1700446210
}
1700446211
1700446212
}
1700446213
1700446214
这段程序看似很完美了,其中考虑到从String转换为枚举类型可能存在着转换不成功的情况,比如没有匹配到指定值,此时valueOf的返回值应该为空,所以后面又紧跟着if……else判断输出。这段程序真的完美无缺了吗?那我们看看运行结果:
1700446215
1700446216
Spring
[
上一页 ]
[ :1.700446167e+09 ]
[
下一页 ]