提高你的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; } }?
?
轉載于:https://www.cnblogs.com/suncoolcat/p/3320040.html
總結
以上是生活随笔為你收集整理的提高你的Java代码质量吧:使用valueof前必须进行校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享网页到微信朋友圈的官方接口
- 下一篇: 转:Java反射教程