开发背景:

在开发过程中遇到需要通过给定的值来获取对应的枚举值,如下例枚举类中,需要通过传入"春"来获取SPRING。

public 

开始尝试通过Enum的内置方法valueOf()获取,使用报错:

public 

输出:

Exception 

我们打开valueOf源码看看他是通过什么值获取,

方法注释

需要通过与声明枚举类型的标识完全匹配,就是说我要通过"SPRING"字符串来获取SPRING枚举类,但我需要的是通过“春”来获取到SPRING。

后来我想到一种实现方法,通过获取枚举类的构造方法,然后反射执行其构造方法来获取。先显示的通过反射看看Season的构造方法长什么样子。

public 

???,小朋友头上多了好多问号,明明我的构造函数只有java.lang.String类型,为什么变成了三个参数了。

于是,我在Season中新增了一个无参构造,再次运行上述代码。

输出

发现无参构造默认加了两个参数,我们打开抽象类Enum看看,发现里面存在下列构造方法,且通过注释可以得知,程序员无需调用此构造方法,当声明枚举类时编译器会自动实现该方法,而参数name、ordinal分别是“与声明枚举类型标识完全匹配的字符串”和“枚举声明在枚举类中的序号,从0开始”。

/**

所以我需要通过传入name、ordinal、和自定义的值("春")来获取对应的SPRING。但是我可能不知道其name和ordinal。或者当我知道其name的情况下,我直接使用valueOf(name)直接就可以获取相关的枚举值了。所有此类方法行不通,而且Class类中的newInstance方法有这么一段代码,就是说如果通过newInstance来反射获取枚举类型的对象将抛出IllegalArgumentException异常。我们用代码试验一下:

newInstance源码

public 

奇怪的知识又多了。这个时候我想到通过利用我在上篇文章中的方法获取。链接在下方:

远方的大猪:枚举工具类-反射获取枚举类中变量的所有值​zhuanlan.zhihu.com

非反射代码实现如下,可以更好的理解设计思路:(需要在枚举类Season类中添加getSeason()方法)

public 

对应的反射实现的工具类如下:

public 

-----------------------------------------------------------------------------------------------

输出

注:上述好多基本方法在文章

远方的大猪:枚举工具类-反射获取枚举类中变量的所有值​zhuanlan.zhihu.com

中已详细说明,此处不冗余讲述,如有不清楚的地方可留言。也请大佬指出不足之处。

总结:

通过上述工具类的开发,触及到了好多知识盲区,不过正是这样也拓展了知识,同时加深了对知识点的理解。

当然在使用反射工具类时也有一些弊端,如需要=抛出比较多的异常。还有,上述工具类只能针对一个自定义的值,当存在多个自定义值时将不能实现。

这里我想到了一种实现方式,能够解决这种多值问题,但只针对多个自定义值的类型不一样的情况,如一个值类型时String,一个是int,这样可以通过类型获取到指定的值。但如果存在两个自定义的值都是String类型时,将无法通过反射知道两个String将如何分配,这里我没有想到好的方式解决。

由于时间关系,类型不同的多值实现将在下次更新。

java枚举返回字符串_枚举工具类-通过给定值获取对应的枚举类相关推荐

  1. java输入一个字符串_在java中如何用键盘输入一个数,字符,字符串

    一,利用 Scanner 实现从键盘读入integer或float 型数据 1 import java.util.*;2 public classtest {3 public static voidm ...

  2. java中转json字符串_如何在Java中转义JSON字符串-Eclipse IDE技巧

    java中转json字符串 在Java应用程序中工作或进行JSON解析时,通常很常见的做法是从某些资源(例如RESTful Web服务)中复制粘贴JSON字符串,然后使用Jackson库解析JSON. ...

  3. java字节流转字符串_字节流与字符流的区别及相互转换

    先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输出都是以流的形 ...

  4. .net mvc actionresult 返回字符串_.NET架构师知识普及

    今天看到一篇漫画,[3年.NET开发应聘大厂惨遭淘汰,如何翻身打脸面试官?],好多问题,一下子还真的回答不了,这里对这些问题进行了整理,增加下脑容量,哈哈.俗话说不想当将军的士兵不是好士兵,不想当架构 ...

  5. java 循环遍历字符串_遍历字符串中所有字符的最快方法

    第一个更新:在生产环境(不建议使用)中尝试此方法之前,请先阅读以下内容:http : //www.javaspecialists.eu/archive/Issue237.html 从Java 9开始, ...

  6. java枚举返回字符串_Java新特性:数据类型可以扔掉了?

     关注"脚本之家",与百万开发者在一起 作者 | 王磊 来源 | Java中文社群(ID:javacn666) 在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些 ...

  7. java 批量替换字符串_# Java 一步一步实现高逼格的字符串替换工具(二)

    Java 一步一步实现高逼格的字符串替换工具(二) 上一篇实现了一个用于字符串替换的方法,主要是利用 正则 + jdk的字符串替换,本篇则会再之前的基础上走一个扩展 1. 之前的方法存在的问题 先把上 ...

  8. java ajax翻页_分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...

  9. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

最新文章

  1. [转载] 钢铁是怎样炼成的——第一部第二章
  2. Maven整合SSM测试
  3. TypeScript 类型兼容
  4. Boost.python 编译和使用
  5. Linux CentOS下配置SVN+SVN勾子
  6. bug death march
  7. 统计自然语言处理基础(一)
  8. elk中kibana中如何显示写入elasticsearch的数据
  9. python行与缩进_Python行结构与缩进的简单介绍
  10. 通信原理眼图画法_通信原理课程总结(二)
  11. 焦仲卿刺杀孙策_惊闻:孙伯符死于焦仲卿之手。。。
  12. 聊一聊HTTP缓存机制
  13. Java Set集合及Map集合详解
  14. 百度网盘视频加速播放
  15. Codeforces - F. Dominant Indices
  16. AMD Fluid Motion Video补帧教程
  17. cpufreq 五种模式
  18. 【基础知识】深度学习中各种归一化方式详解
  19. 白盒测试--数据流测试
  20. Codeforces Round #783 (Div. 2) A-F

热门文章

  1. php foreach创建文件,php – mkdir()在foreach函数中跳过第一个文件
  2. git 添加用户名和邮箱_Git安装与基础使用
  3. swift 笔记 (十三) —— 继承
  4. [六省联考2017]相逢是问候(线段树+拓展欧拉定理)
  5. (大一)——自学计划
  6. ThinkJS框架入门详细教程(二)新手入门项目
  7. 10000元重金奖励:谁能开发这样的编辑软件程序,编辑软件功能说明
  8. python 列表生成式 字典生成式
  9. Ubuntu18.04图片信息查看器
  10. Android 8.0 VDEX机制简介