自定义枚举类型中,假如我们有name和desc这样的属性,并在这个基础上定义了多个对象.

那么就可能用到通过name获取desc,或者通过desc获取name.通过name或者desc获取对应的枚举对象的名称或ordinal等等.
我们可以定义一个接口,所有的枚举类型都实现这个接口,这样使用会更方便.
直接上代码,看看如何方便的操作这些需求.

定义一个接口:
  1. package com.xjl456852.myenum;
  2. /**
  3. * Created by xiejianglei on 2017/1/9.
  4. */
  5. public interface TestEnum {
  6. String code();
  7. String desc();
  8. //这个方法是子类枚举类型自带的方法,子类无需实现,也无法实现
  9. String name();
  10. //这个方法是子类枚举类型自带的方法,子类无需实现,也无法实现
  11. int ordinal();
  12. }
自定义枚举类型,实现定义的接口:
  1. package com.xjl456852.myenum;
  2. /**
  3. * Created by xiejianglei on 2017/1/9.
  4. */
  5. public enum TestSubEnum implements TestEnum {
  6. MALE("1","man"),FEMALE("2", "woman");
  7. private final String code;
  8. private final String desc;
  9. TestSubEnum(String code, String desc) {
  10. this.code = code;
  11. this.desc = desc;
  12. }
  13. @Override
  14. public String code() {
  15. return this.code;
  16. }
  17. @Override
  18. public String desc() {
  19. return this.desc;
  20. }
  21. }

写个工具类:
  1. package com.xjl456852.myenum;
  2. /**
  3. * Created by xiejianglei on 2017/1/9.
  4. */
  5. public class Util {
  6. /**
  7. * 通过code获取desc
  8. * @param code
  9. * @param type
  10. * @param <T>
  11. * @return
  12. */
  13. public static <T>String getDescByCode(String code, Class<T>type) {
  14. if (type.isEnum()) {
  15. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  16. if (constant.code().equalsIgnoreCase(code)) {
  17. return constant.desc();
  18. }
  19. }
  20. }
  21. return null;
  22. }
  23. /**
  24. * 通过desc获取code
  25. * @param name
  26. * @param type
  27. * @param <T>
  28. * @return
  29. */
  30. public static <T>String getCodeByDesc(String name, Class<T>type) {
  31. if (type.isEnum()) {
  32. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  33. if (constant.desc().equalsIgnoreCase(name)) {
  34. return constant.code();
  35. }
  36. }
  37. }
  38. return null;
  39. }
  40. /**
  41. * 通过desc获取对应EnumName对象的名称
  42. * @param name
  43. * @param type
  44. * @param <T>
  45. * @return
  46. */
  47. public static <T>String getEnumNameByDesc(String name, Class<T>type) {
  48. if (type.isEnum()) {
  49. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  50. if (constant.desc().equalsIgnoreCase(name)) {
  51. return constant.name();
  52. }
  53. }
  54. }
  55. return null;
  56. }
  57. /**
  58. * 通过code获取对应EnumName对象的名称
  59. * @param code
  60. * @param type
  61. * @param <T>
  62. * @return
  63. */
  64. public static <T>String getEnumNameByCode(String code, Class<T>type) {
  65. if (type.isEnum()) {
  66. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  67. if (constant.code().equalsIgnoreCase(code)) {
  68. return constant.name();
  69. }
  70. }
  71. }
  72. return null;
  73. }
  74. /**
  75. * 通过code或desc获取对应EnumName对象的名称
  76. * @param any
  77. * @param type
  78. * @param <T>
  79. * @return
  80. */
  81. public static <T>TestEnum getEnumTypeByAny(String any, Class<T>type) {
  82. if (type.isEnum()) {
  83. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  84. if (constant.code().equalsIgnoreCase(any) || constant.desc().equalsIgnoreCase(any)) {
  85. return constant;
  86. }
  87. }
  88. }
  89. return null;
  90. }
  91. /**
  92. * 通过EnumName对象的名称,获取对应的枚举对象
  93. * @param enumName
  94. * @param type
  95. * @param <T>
  96. * @return
  97. */
  98. public static <T>TestEnum getEnumTypeByEnumName(String enumName, Class<T>type) {
  99. if (type.isEnum()) {
  100. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  101. //也可以使用constant.toString()替代constant.name()
  102. if (constant.name().equalsIgnoreCase(enumName)) {
  103. return constant;
  104. }
  105. }
  106. }
  107. return null;
  108. }
  109. /**
  110. * 通过code或desc获取对应ordinal值
  111. * @param any
  112. * @param type
  113. * @param <T>
  114. * @return
  115. */
  116. public static <T>int getOrdinalByAny(String any, Class<T>type) {
  117. if (type.isEnum()) {
  118. for (TestEnum constant : (TestEnum[])type.getEnumConstants()){
  119. if (constant.code().equalsIgnoreCase(any) || constant.desc().equalsIgnoreCase(any)) {
  120. return constant.ordinal();
  121. }
  122. }
  123. }
  124. return -1;
  125. }
  126. }
测试方法:
  1. package com.xjl456852.myenum;
  2. import static com.xjl456852.myenum.Util.*;
  3. /**
  4. * Created by xiejianglei on 2017/1/9.
  5. */
  6. public class TestMain {
  7. public static void main(String args[]) {
  8. String code = "1";
  9. String desc = "man";
  10. String enumName = "MALE";
  11. //通过枚举类型自带方法获取枚举类型的名字
  12. System.out.println(TestSubEnum.MALE.name());
  13. //通过自定义枚举类型的code,获取枚举类型的desc
  14. System.out.println(getDescByCode(code, TestSubEnum.class));
  15. //通过自定义枚举类型的desc,获取枚举类型的code
  16. System.out.println(getCodeByDesc(desc, TestSubEnum.class));
  17. //通过自定义枚举类型的code,获取枚举类型的名字
  18. System.out.println(getEnumNameByCode(code, TestSubEnum.class));
  19. //通过自定义枚举类型的desc,获取枚举类型的名字
  20. System.out.println(getEnumNameByDesc(desc, TestSubEnum.class));
  21. //通过自定义枚举类型的code或desc,获取枚举类型对象
  22. System.out.println(getEnumTypeByAny(code, TestSubEnum.class));
  23. //通过自定义枚举类型的code或desc,获取枚举类型对象
  24. System.out.println(getEnumTypeByAny(desc, TestSubEnum.class));
  25. //通过自定义枚举类型的code或desc,获取枚举类型的ordinal
  26. System.out.println(getOrdinalByAny(code, TestSubEnum.class));
  27. //通过自定义枚举类型的对象名称,获取对应枚举类型的对象
  28. System.out.println(getEnumTypeByEnumName(enumName, TestSubEnum.class));
  29. }
  30. }
测试结果如下:
MALE
man
1
MALE
MALE
MALE
MALE
0
MALE

自定义枚举类型的常用操作-附源码(xjl456852原创)的更多相关文章

  1. C#枚举类型的常用操作总结

    枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...

  2. ElasticSearch+Kibana 索引操作( 附源码)

    一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elastics ...

  3. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  4. jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)

    上一篇记录了BaiduTemplate模板引擎使用示例附源码,在此基础上对使用方法进行了封装 自定义插件jajaxrefresh.js 代码如下: //闭包限定命名空间 (function ($) { ...

  5. 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】

    项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript ...

  6. swfupload多文件上传[附源码]

    swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项 ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

  8. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  9. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

随机推荐

  1. Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  2. oracle的concat的用法

    select concat( concat( concat( ( select area_name from ec_area where area_id ), ( select area_name f ...

  3. 动态图片 gif

    简介 android不推荐使用gif图片,一般都是png的,对于gif的图片解析比较消耗资源,但是对于一些动态gif图片的播放,如果比较小的话还是可以的,要是大的话,建议还是把gif图片转换成一帧一帧 ...

  4. 初学JavaScript须知道的七件事

    1.1.缩略标记 //定义对象 //var car = new Object(); //car.colour = 'red'; //car.wheels = 4; //car.hubcaps = 's ...

  5. 图片跟着鼠标动js

    <!DOCTYPE html><html><head> <title>duisgf</title> <meta charset=&qu ...

  6. Java字符串的10大热点问题,你都懂吗?

    转自 威哥干JAVA http://www.codingke.com 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1.如何比较字符 ...

  7. Eclipse 导入项目乱码问题(中文乱码)

    1.编码不对 a.对某文件或某工程更改编码:   鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码 ...

  8. vs2008下使用libcurl

    网上找了半天,总算找到一个比较好用的C++ 网络库,老实说,完全用Socket操作网络对于需要开发网络应用程序的人员来说还是很蛋疼很繁琐的.好在有这么一个给力的库.这个库的介绍可以自己百度一下,就我所 ...

  9. 模拟键盘输入首先要用到一个API函数:keybd_event

    转自:http://www.cnblogs.com/cpcpc/archive/2011/02/22/2123055.html 模拟键盘输入首先要用到一个API函数:keybd_event. 模拟按键 ...

  10. 使用微软 AppFabric 遇到问题

    我做的一个项目用了,但是遇到很奇怪的问题,在测试环境下,两台机做集群,一切正常,达到设计要求,但是部署到专用网络(内部网络,无法访问internet),老是提示访问服务器超时,初步排查,发现貌似是域的 ...