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

来源:互联网 发布:qq空间网络音乐 编辑:程序博客网 时间:2024/04/30 20:10

一、分析 

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级别,如果不判断所有枚举就不能通过编译