zoukankan      html  css  js  c++  java
  • [改善Java代码]在switch的default代码块中增加AssertionError错误

    switch的后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句似乎没有任何作用了,程序已经列举出了所有的可能选项,肯定不会执行到default语句,.

    错了...这个default还是很有用的,以我们定义的日志级别来举例说明,这是一个典型的枚举常量.如下所示:

     1 public class Client {
     2     public static void main(String[] args) {
     3         LogLevel logLevel = LogLevel.INFO;
     4         switch (logLevel) {
     5         case DEBUG:
     6             System.out.println("****Debug Log*****");
     7             break;
     8         case INFO:
     9             System.out.println("****Info Log*****");
    10             break;
    11         case WARN:
    12             System.out.println("****Warn Log*****");
    13             break;
    14         case ERROR:
    15             System.out.println("****Error Log*****");
    16             break;
    17         }
    18     }
    19 }
    20 
    21 enum LogLevel {
    22     DEBUG, INFO, WARN, ERROR;
    23 }

    把所有的枚举项都列举完了,不可能有其他值,所以就不需要default代码块了,这是普遍认识,但问题是我们的switch代码块与枚举之前没有强制约束关系,也就说两者只是在语义上建立了联系,并没有一个强制约束,比如LogLevel枚举发生改变,增加了一个枚举项FATAL,如果此时我们对switch不做任何的修改,编译虽然不会出现问题,但是运行期会发生非预期的错误:FATAL类型的日志没有输出.

    为了避免这类的非预期的错误,建议在default后直接抛出一个AssertionError错误,其含义就是"不要跑到这里来,一跑到这里就会出问题",这样一来很容易查找到错误,方便立刻排除.

    当然也有其他方法可以解决此问题,比如修改IDE工具,以Eclipse为例,可以把Java--->Complier---->Errors/Warnings中的"Enum type constant not covered on switch"设置为Error级别,如果不判断所有的枚举项就不能通过编译.

  • 相关阅读:
    Redis笔记 —— string 篇
    解决跨域请求无法携带Cookie的问题
    Mysql事务学习笔记
    Redis笔记 —— hash 篇
    mysql视图的简单学习
    axios无法被识别为ajax请求的解决方案
    常见header信息详解
    int 15h
    操作系统有进程了
    是时候走我自己的路线了,真正的做我自己的Jinux
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5632770.html
Copyright © 2011-2022 走看看