Java中的枚举的治理
版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷
一、为啥用枚举&为啥要对枚举进行治理
1.先来说说为啥用枚举
表中某个字段标识了这条记录的状态,我们往往使用一些code值来标识,例如01成功,00失败。
多状态共性的东西可以常量保存,例如
class Constants{
public static final String success = "01";
public static final String failure= "00";
}
然而,在一些大型项目中,表的数量极多,一些表中需要维护的状态也极多,如果都在如上的Constants中维护,试想如果添加一个状态值,那么需要在整个篇幅中找到对应的块,然后去新增值;修改呢?同样麻烦!!!
所以我们使用枚举,每个枚举类就只负责对一个状态做维护,这样我们方便增删改。例如:
/**
* Created by Bright on 2017/3/13.
*
* @author :
*/
public enum Payment {
Payment_WX("010000","微信支付"),
Payment_ZFB("010001","支付宝支付"),
Payment_YL("010002","银联支付"); public static Map<String,String> map = new HashMap<String, String>(); static{
Payment[] values = Payment.values();
if(values.length > 0){
for(Payment product : values){
map.put(product.getCode(),product.getName());
}
}
} Payment(String code, String name){
this.code = code;
this.name = name;
} private String code; private String name; public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
2.为啥要用java反射处理枚举呢?
我们之前看到了,使用Constants很方便,可以直接通过这个类的静态字段拿到值。当我们使用枚举时,当枚举类逐渐增多时,我们会发现,不同的地方我们需要获取不同的类,然后再通过不同的枚举获取到不同的值。这又势必是个头痛的事情。
那么我们想到了改进的方法:
改进一:把每个枚举类中放个map,把其code和name值映射进去,然后调用时通过静态map对象,把code值作为key传入,势必能获取到对应的描述。(如上段代码的map值)
然而,这个改进后,我们依旧需要找到这个类,然后去使用它的静态map,能不能只通过一个类进行统一治理呢?
改进二:通过一个类,把所有枚举在该类中注册,然后通过该类直接获取到相应的枚举值及name描述。
二、枚举治理的实现
1.先弄清我们使用枚举的场景
1.1通过枚举类中枚举名获取到枚举的code值(使用上面的枚举值定义)
例如:{"Payment_WX":"010000","Payment_YL":"010002","Payment_ZFB":"010001"}
if(param.equals(Payment.Payment_WX.getCode()){}
1.2通过枚举类中枚举的code值获取到对应的name描述(使用上面的枚举值定义)
例如:{"010002":"银联支付","010001":"支付宝支付","010000":"微信支付"}
Payment.map.get(Payment.Payment_WX.getCode());
2.枚举治理工具类的实现
/**
* Created by Bright on 2017/3/13.
*
* @author :
*/
public class VelocityEnumTools { public static final Logger logger = LoggerFactory.getLogger(VelocityEnumTools.class); //通过枚举获取枚举code值,例如:{"Payment_WX":"010000","Payment_YL":"010002","Payment_ZFB":"010001"}
public static Map<String,Map<String,String>> mapKeyCode = new HashMap<String, Map<String, String>>(); //通过code值获取枚举name,例如:{"010002":"银联支付","010001":"支付宝支付","010000":"微信支付"}
public static Map<String, Map<String, String>> mapCodeName = new HashMap<String, Map<String, String>>(); /**
* 需要在页面控制的enum,如Payment类似添加即可
*/
static {
//通过枚举获取code值
mapKeyCode.put(Payment.class.getSimpleName(), getEnumMap(Payment.class));
//通过code值获取枚举name
mapCodeName.put(Payment.class.getSimpleName(),getEnumCodeMap(Payment.class));
} /**
* 通过枚举获取code值
* @param enumKey
* @return
*/
public static Map<String, String> getKeyCodeMapperInstance(String enumKey) {
return mapKeyCode.get(enumKey);
} /**
* 通过code值获取枚举name
* @param enumKey
* @return
*/
public static Map<String, String> getCodeNameMapperInstance(String enumKey) {
return mapCodeName.get(enumKey);
} public static <T> Map<String, String> getEnumMap(Class<T> clazz) {
Map<String, String> map = new HashMap<String, String>();
try {
if (clazz.isEnum()) {
Object[] enumConstants = clazz.getEnumConstants();
for (int i = 0; i < enumConstants.length; i++) {
T t = (T) enumConstants[i];
Field code = t.getClass().getDeclaredField("code");
code.setAccessible(true);
map.put(t.getClass().getDeclaredFields()[i].getName(), (String) code.get(t));
}
}
} catch (NoSuchFieldException e) {
logger.error("枚举工具启动报错:{}", e);
} catch (IllegalAccessException e) {
logger.error("枚举工具启动报错:{}", e);
}
return map;
} private static <T> Map<String,String> getEnumCodeMap(Class<T> clazz) {
Map<String, String> map = new HashMap<String, String>();
try {
if (clazz.isEnum()) {
Object[] enumConstants = clazz.getEnumConstants();
for (int i = 0; i < enumConstants.length; i++) {
T t = (T) enumConstants[i];
Field code = t.getClass().getDeclaredField("code");
Field name = t.getClass().getDeclaredField("name");
code.setAccessible(true);
name.setAccessible(true);
map.put((String) code.get(t),(String) name.get(t));
}
}
} catch (NoSuchFieldException e) {
logger.error("枚举工具启动报错:{}", e);
} catch (IllegalAccessException e) {
logger.error("枚举工具启动报错:{}", e);
}
return map;
} public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Map<String, String> enumMap = getEnumMap(Payment.class);
System.out.println(JSON.toJSONString(enumMap));//{"Payment_WX":"010000","Payment_YL":"010002","Payment_ZFB":"010001"}
Map<String, String> enumCodeMap = getEnumCodeMap(Payment.class);
System.out.println(JSON.toJSONString(enumCodeMap));//{"010002":"银联支付","010001":"支付宝支付","010000":"微信支付"}
}
}
三、枚举治理的扩展-velocity中使用枚举
1.为什么会在velocity中使用枚举
当涉及与前端的交互时,我们可能需要从前端把三种支付方式对应的code值传到后台。
此时,如果在页面上直接写010000这样的值,那么页面的逻辑就很不直观了,今天写的时候你还能认知,为了防止自己忘了,除了加注释别无办法。
故,为了解决后台可用,且前端页面直观,所以我们希望尝试在页面上直接用枚举来解决问题。
2.看看页面如何处理(velocity页面中)
#set($payment=$enumTool.getCodeNameMapperInstance("Payment"))//直接写明要获取的枚举类型名称
#if($payment.get("Payment_WX") == $param.code)//通过枚举值获取其code值
//做微信支付页面逻辑
#end
2.velocity中配置velocity-tools
<?xml version="1.0" encoding="UTF-8"?>
<toolbox>
<tool>
<key>enumTool</key>
<class>com.bright.core.enumconstant.VelocityEnumTools</class>
</tool>
<tool>
<key>stringTool</key>
<class>org.apache.commons.lang.StringUtils</class>
</tool>
<tool>
<key>dateTool</key>
<class>org.apache.velocity.tools.generic.DateTool</class>
</tool>
</toolbox>
这样就可以简单的在页面中应用我们枚举治理工具了。
例如:通过code值获取到相应描述
$enumTool.getCodeNameMapperInstance("Payment").get($item.orderLoanStatus)//显示“微信支付”
通过枚举获取到对应的code值
#set($payment=$enumTool.getCodeNameMapperInstance("Payment"))//拿到了Payment的map
$payment.get("Payment_WX")
就此,我们可以实现系统的中的枚举治理,并且可在前端页面灵活应用。
Java中的枚举的治理的更多相关文章
- 【译】Java中的枚举
前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...
- Java中的枚举类型详解
枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...
- 扒一扒: Java 中的枚举
目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类 ...
- 全面解读Java中的枚举类型enum的使用
这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...
- 用好Java中的枚举真的没有那么简单
1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...
- JAVA中的枚举小结
枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...
- 说说Java中的枚举(一)
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...
- Android笔记:java 中的枚举
部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...
- Java中Enum枚举的使用
三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强. 2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例. 3.所有 ...
随机推荐
- HMX-Server C++ 分步式服务器大版本更新了(有源码)
原文地址:http://www.cnblogs.com/hellohuang/p/6294763.html # HMX-ServerHMX-Server分步式服务器框架,主要分为网关.登录.世界.场景 ...
- 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索
实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度 ...
- JS消化理解
JS执行的时候是必须在网页里面执行,和样式表差不多,也是内嵌的样式表,嵌在网页里面或外部的! 一 嵌在网页里面怎么嵌? 如果你想在网页里面嵌脚本,你需要在网页里面打出一块区域,这块区域来写脚本,在写样 ...
- 浅谈Django的Q查询以及AngularJS的Datatables分页插件
使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否 ...
- angular2使用官网npm install下载依赖失败的处理方法
上一两个月在学习angular2,在下载依赖阶段看官网是直接自动下载的,[npm install] 就能把依赖全部弄下来.不过作为新手的我,是倒腾来倒腾去都倒不出来,因为老是报同一个错.官网也还有手动 ...
- asyncio
一.简介 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用, ...
- BZOJ 1004: [HNOI2008]Cards(群论)
好吧我就是蒟蒻根本没听说过群论(虽说听叉姐说几万年都不会考) 我也讲不太来,直接戳VFK大神的blog啦 = = http://vfleaking.blog.163.com/blog/static/1 ...
- WP8.1开发中找程序下的Assets文件夹
这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...
- cookie跨域和js跨域问题
js跨域:主机名,协议,端口号只要有任何一个不同,就不能成立
- 每天一个Linux命令(17)--whereis命令
whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...