提高你的Java代码质量吧:在switch的default代码块中增加AssertionError错误

2014-11-24 09:26:30 · 作者: · 浏览: 1
一、分析
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中的Enum Type constant nont covered on 'switch'设置为Error级别,如果不判断所有枚举就不能通过编译。