自定义枚举类型中,假如我们有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. DBMS_STATS常用方法(收集oracle信息)

    –收集数据库信息EXEC DBMS_STATS.gather_database_stats;EXEC DBMS_STATS.gather_database_stats(estimate_percent ...

  2. vipw和vigr命令

    Modifying the Configuration Files To add user accounts, it suffices that one line is added to /etc/p ...

  3. 【转】node-webkit:开发桌面+WEB混合型应用的神器

    顾名思义,node-webkit就是nodejs+webkit. 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node ...

  4. JAVA小项目之五子棋

    五子棋V1.0 功能: 人人对战,人机对战(初级) 记录双方分数: 主要知识点: 二维坐标系中,各方向坐标的关系及规律. 效果图: 主框架类: package com.gxlee.wzq; /** * ...

  5. (转)Repeater在无数据记录时显示暂无数据

    方法就是在FooterTemplate加个Label并根据repeater.Items.Count判断是否有记录.关键代码如下: <FooterTemplate>     <asp: ...

  6. (转)javascript中return的作用

    这里面的return含有一些细节知识: 例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别 JAVASCRIPT在事件中调用函数 ...

  7. 日期 bootsrtap-datatimepicker and bootstrap-datepicker 控件支持中文

    引用 bootsrtap-datatimepicker and bootstrap-datepicker 控件,发现官方控件不支持中文 1,bootstrap-datepicker - >解决方 ...

  8. vsftp的设置选项

    设置匿名用户上传的文件的权限: anon_umask=  匿名用户新增文件的umask 数值.默认值为077.     VSFTPD的设置选项 VSFTPD的配置文件/etc/vsftpd/vsftp ...

  9. JavaScript 客户端JavaScript之 脚本化浏览器窗口

    1.计时器 客户端Javascript以全局函数setTimeOut().clearTimeOut().setInterval().clearInterval()提供这一功能.   前者是从运行的那一 ...

  10. mysql死锁--源于外键关联

    死锁 存在于行级锁 存在的条件 1.资源只能同时被一个线程占有 2.资源占有不能被强制剥夺 3.请求和保持占有(在请求占有资源的同时能保持现有资源的占有) 4.死循环(一般做程序的人最关注的点) 一到 ...