zoukankan      html  css  js  c++  java
  • 提高你的Java代码质量吧:使用valueof前必须进行校验

    一、分析 

    每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode、name、valueOf等,其中valueOf方法会把一个String类型的名称转变成枚举项,也就是在枚举项中查找字面值和该参数相等的枚举项。 

    我们来深入分析一下该valueOf方法的源代码 

     

    public static <T extends Enum<T>> T valueof(Class<T> enumType,String name){ 
        //通过反射,从常量列表中查找 
        T result = enmuType.enumConstantDirector().get(name); 
        if(result != null) 
            return result; 
        if(name == null) 
            throw new NullPointerException("Name is null"); 
        //最后排除无效参数异常 
        throw new IllegalArgumentException("No enum const" + enumType + "." + name); 
    } 

    valudOf方法通过反射从枚举类的常量声明中查找,若找到就直接返回,若找不到则抛出无效参数异常。valueOf的本意是保护编码的枚举安全性,使其不产生空枚举对象,简化枚举操作,但是却又引入了一个我们无法避免的IllegalArgumentException异常。 

    二、场景 

    我们来看如下代码 

     

    public static void main(String[] args){ 
        //注意summer是小写 
        List<String> params = Arrays.asList("Spring","summer"); 
        for(String name:params){ 
            //查找字面值与name相同的枚举项 
            Season s = Season.valueOf(name); 
            if(s != null){ 
                //有枚举项时 
                System.out.println(s); 
            }else{ 
                //没有枚举项 
                System.out.println("没有相关枚举项"); 
            } 
        } 
    } 

    summer无法转换Season枚举,根据上面的分析,就会抛出IllegalArgumentException异常,一旦抛出异常,后续的代码就不运行了!!! 

    这与我们的习惯很不一致,例如我们从一个List中查找一个元素,即使不存在也不会报错,顶多返回indexOf方法返回-1。 

    三、建议 

    1.使用try-catch捕捉异常 

     

    try{ 
        Season s = Season.valueOf(name); 
        //有该枚举项时处理 
        System.out.println("s"); 
    }catch(Exception e){ 
        System.out.println("无相关枚举项"); 
    } 

    2.扩展枚举类 

    由于Enum类定义的方法都是final类型的,所以不希望被覆写,我们可以通过增加一个contains方法来判断是否包含指定的枚举项,然后在继续转换,代码如下: 

     

    enum Season{ 
        Spring,Summer,Autumn,Winter; 
     
        //是否包含枚举项 
        public static boolean contains(String name){ 
            //所有的枚举值 
            Season[] season = values(); 
           //遍历查找 
           for(Season s : season){ 
               if(s.name().equals(name)){ 
                   return true; 
               } 
           } 
     
           return false; 
        } 
    } 


  • 相关阅读:
    构建之法阅读笔记04
    构建之法阅读笔记03
    第十二周学习进度情况
    课堂练习-找水王
    第十一周学习进度情况
    第十周学习进度情况
    课后作业:寻找水王
    《人月神话》阅读笔记01
    学习进度条
    学习进度条
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3320040.html
Copyright © 2011-2022 走看看