美食网站开发的背景,做网站推广需要什么,猎头公司电话,wordpress 分类页模板一、分析 每个枚举都是java.lang.Enum的子类#xff0c;都可以访问Enum类提供的方法#xff0c;比如hashCode、name、valueOf等#xff0c;其中valueOf方法会把一个String类型的名称转变成枚举项#xff0c;也就是在枚举项中查找字面值和该参数相等的枚举项。 我们来深入… 一、分析 每个枚举都是java.lang.Enum的子类都可以访问Enum类提供的方法比如hashCode、name、valueOf等其中valueOf方法会把一个String类型的名称转变成枚举项也就是在枚举项中查找字面值和该参数相等的枚举项。 我们来深入分析一下该valueOf方法的源代码 public static T extends EnumT T valueof(ClassT 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是小写 ListString 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; }
} 转载于:https://www.cnblogs.com/suncoolcat/p/3320040.html