自定义枚举类型中,假如我们有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. tortoisegit 保存用户名密码

    方法一当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只 ...

  2. 监听视图树 OnGlobalLayoutListener

    背景 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们写一个控件 public class MyImageView extends ImageView ...

  3. OD: Heap Overflow (XP SP2 - 2003) & DWORD SHOOT via Chunk Resize

    微软在堆中也增加了一些安全校验操作,使得原本是不容易的堆溢出变得困难重重: * PEB Random:在 Windows XP SP2 之后,微软不再使用固定的 PEB 基址 0x7FFDF000,而 ...

  4. HTML5 microdata

    schema.org 测试地址 http://www.google.com/webmasters/tools/richsnippets

  5. 网络编程 socket-实例

    1.设计界面:   2.效果界面:   3.具体实现代码:   public partial class frmMain : Form { public frmMain() { InitializeC ...

  6. WPF Mahapps.Metro 设置主题样式

    /// <summary> /// 设置App样式 /// </summary> /// <param name="accentName">窗口 ...

  7. javascript 广告移动特效

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. 关于js闭包杂记

    闭包:一个函数oneF里return了另一个函数innerF,然后在oneF外面运行了函数innerF,如果innerF里有用到在oneF里定义的变量,则此时依然可以引用到, 但是变量值不是定义函数i ...

  9. 逆天的IE7中,诡异的横向滚动条

    今天老邹我又要吐槽IE7了,这个奇葩浏览器总是不让省心.这回遇到的问题,灰常难发现是怎么回事,不过还是让我发现原因,哈哈,只要原因去干掉这个问题比躲避问题用别的办法绕开要爽的多啊. 首先我还是介绍下, ...

  10. mysql时间int日期转换

    select from_unixtime(1350437720);select unix_timestamp(now());插入用 unix_timestamp(date)查询用from_unixti ...