验证java代码质量_提高你的Java代码质量吧:使用valueof前必须进行校验

一、分析

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

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

public static > T valueof(Class 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 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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值