一、分析
switch后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句没有任何作用,程序已经列举了所有的可能选项,肯定不会执行到default语句,看上去纯属多余!
二、场景
错了!这个default还是很有用的,以我们定义日志级别来举例说明,这是一个典型的枚举常量,如下所示:
enum LogLevel{
DEBUG,INFO,WARN,ERROR;
}
一般在使用的时候,会通过switch语句来决定用户设置的级别,然后输出到不同级别的日志,代码如下:
switch(logLevel){
case DEBUG:
… …
case INFO:
… …
case WARN:
… …
case ERROR:
…
}
由于把所有的枚举都列举完了,不肯能有其他的值,所有就不需要default代码块了,这是普遍的认识。
如果LogLevel枚举发生的改变,增加了一个枚举项FATAL,如果此时我们对switch语句不做任何修改,编译虽不会出问题,但是运行期间会发生非预期的错误:FATAL类型的日志没有输出。
三、建议
为了避免这种错误,建议在default后抛出一个AssertionError错误,这样可以保证在增加一个枚举的情况下,若其代码未修改,运行期马上就会报错,这样一来容易查找错误,方便立刻排除。
当然也有其它方法解决,比如修改IDE工具,以Eclipse为例,可以把Java->Compiler->Errors/Warnings中的EnumType constantnontcovered on 'switch'设置为Error级别,如果不判断所有枚举就不能通过编译。