每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode、name、valueOf等,其中valueOf方法会把一个String类型的名称转变成枚举项,也就是在枚举项中查找字面值和该参数相等的枚举项。
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。
try{
Season s = Season.valueOf(name);
//有该枚举项时处理
System.out.println("s");
}catch(Exception e){
System.out.println("无相关枚举项");
}
由于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;
}
}
分享到:
相关推荐
调整参数后引起,ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 3 2768M 的解决方案
Time Is Money: The Business Value of Web Performance Authors: Tammy Everts ISBN 10: 1491928743 ISBN 13: 9781491928745 Edition: 1 Released: 2016-06-18 Format: Paperback (110 pages) List Price: $19.99 ...
could not read symbols: Bad value,只在64位linux下出现的问题,需要在编译时加上-fPIC
该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...
NULL 博文链接:https://never-forget.iteye.com/blog/1833801
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
A Brief Review of ChatGPT: Its Value and the Underlying GPT TechnologyA Brief Review of ChatGPT: Its Value and the Underlying GPT TechnologyA Brief Review of ChatGPT: Its Value and the Underlying GPT ...
本文通过代码给大家讲解了JAVA中Integer.valueOf, parsetInt() String.valueOf的区别和结果,需要的朋友可以参考下
Type 异常报告 消息 Failed to convert ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co
用Java实现的词频统计,代码。为了统计词汇出现频率,最简单直接的做法是另外建一个Map:key是单词,value是次数。将文章从头读到尾,读到一个单词就到Map里查一下,如果查到了则次数加一,没查到则往Map里一扔。...
Apache 官方 URLEncodedUtils.java 工具类,可以用来获取Url中的字段value值
• Service Distance: average value of the current index Service Distance; • Service Rate: average frequency of firings (inverse of Service Distance); • Service Time: average value of the current ...
类似ant可以变量引用,引用环境变量使用${env.JAVA_HOME}, 引用System.getProperties()直接引用 2.自动替换generator.properties中的句号(.)为反斜杠,设置key为key+"_dir"后缀 示例: pkg=...
Auto 是 Google 开发的一组 Java 代码生成器。Java 有许多机械、重复、未经测试的代码,而且有时会出现一些微妙的 Bug 。Auto 项目是自动执行这些类型的任务的代码生成器的集合,他们可以无 Bug 创建你要编写的代码...
Java中正则表达式使用方法详解,包括基础语法,初步认识,范围 各种条件限制验证等等
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
本文主要介绍了关于MySQL存储表情报错:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\xA9\x0D\x0A…’的相关解决方法,分享出供大家参考学习,下面话不多说了,来一起看看详细的介绍: ...
游戏分析学Springer.Game Analytics.Maximizing the Value of Player Data