之前对于枚举只是稍有印象,这次做金融项目中,用到了枚举,感觉很简单,也很好玩。
枚举是一种类型,用来定义一组取值范围固定的变量。例如,表示性别的:male ,famale就是一个枚举。
个人觉得枚举非常灵活。没有枚举的时候,下拉框里面的常规选项,可以通过查询数据库来加载,也可以写死再页面上。如果下拉框里面的字段很多,或者需要经常性的变动,维护的代价是很大的,要么动数据库,要么动前台代码。但是如果使用枚举,通过一个枚举类来维护就可以了。枚举实现了页面显示和业务逻辑的解耦,减少了访问数据库的压力。
下面通过代码,给大家展示一下枚举的应用。此处的应用场景是,卡券的类型:体验金、加息券、返现券,可以把这三个卡券类型放到枚举中,加载到前台的下拉框中。
CardCouponsTypeController.java
/** * 卡券类型管理查询 * @author wm * */ public class CardCouponsTypeController extends AService { //定义logger,打印日志 private static Logger logger = Logger.getLogger(PrizeController.class); //定义Map @SuppressWarnings("rawtypes") public Map outputMap = new HashMap(); //定义错误list @SuppressWarnings("rawtypes") public List errList = new ArrayList<Object>(); //实例化卡券管理的Service CardCouponsTypeService CardCouponsTypeService= new CardCouponsTypeService(); /** * 查询卡券类型信息 * @param context */ @SuppressWarnings({ "unchecked", "rawtypes" }) public void listCardCouponsType(Context context){ SqlMapClient sqlMap = DataAccessor.getSession(); Map outputMap = new HashMap(); List errorList = context.errList; try { if (errorList.isEmpty()) { outputMap.put("searchItem", context.contextMap.get("searchItem"));// 搜索条件 //查询活动信息 DataWrap dataWarp =CardCouponsTypeService.queryCardCouponsTypeList(sqlMap,context.contextMap); outputMap.put("dw", dataWarp); outputMap.put("searchContent",context.contextMap.get("searchContent"));//查询 outputMap.put("statusEnum",CardCouponsTypeStatusEnum.getList());//卡券启用状态:0-不可用(默认值) 1-可用 outputMap.put("cardTypeEnum",CardCouponsTypeOfCardEnum.getList());//卡券类型:1-体验金,2-加息券,3-返现券 } } catch (Exception e) { errorList.add("系统错误,请联系系统管理员!"); logger.error(this.getClass().getName() + ":", e); e.printStackTrace(); } if (errorList.isEmpty()) { //转向卡券管理查询信息页 Output.jspOutput(outputMap, context, "/redpackage/CardCouponsTypeList.jsp"); } else { //转向错误页 outputMap.put("errList", errorList); Output.jspOutput(outputMap, context, "/system/error.jsp"); } } }
CardCouponsTypeEdit.jsp
<td style="width: 10%;"><span>卡券类型</span></td> <td><select name="VOUCHER_TYPE" value="${CardTypeBean.VOUCHER_TYPE}" id="VOUCHER_TYPE" style="width: 90%; height: 20px;" dataType="Require" msg="红包类型不能为空" class="Required"> <option value='' selected="selected">请选择</option> <c:forEach items="${type_list}" var="sta"> <option value="${sta.CODE}" <c:if test="${sta.CODE eq CardTypeBean.VOUCHER_TYPE}">selected="selected"</c:if>>${sta.FLAG}</option> </c:forEach> </select> </td>
CardCouponsTypeOfCardEnum.java
package com.voiinnov.puhuilicai.redpackage.Enum; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.brick.dataDictionary.annotation.EnumMark; /** * 卡券类型 是否启用状态 枚举 王美 2016年3月2日14:31:05 * @author wm * */ public enum CardCouponsTypeOfCardEnum { /**体验金*/ @EnumMark(value="体验金") EXPERIENCE_MONEY(1), /**加息券*/ @EnumMark(value="加息券") ADD_INTEREST(2), /**返现券*/ @EnumMark(value="返现券") RETURN_MONEY(3) ; /** * 成员变量 */ private Integer value; /** * 参数方法 * @param value */ private CardCouponsTypeOfCardEnum(Integer value) { this.value = value; } /** * 获取枚举值对应的实际值 get方法 * * @return the value */ public Integer getValue() { return value; } /** * 读取所有的枚举值及标识名字 * 编码:CODE * 名称:NAME * @return * */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static List getList(){ List list = new ArrayList(); Map map = null; //values()得到全部的枚举内容,然后以对象数组的形式用foreach输出 for (CardCouponsTypeOfCardEnum be : values()) { EnumMark mark; try { //枚举获取枚举名字+注释 mark = CardCouponsTypeOfCardEnum.class.getField(be.name()).getAnnotation(EnumMark.class); map = new HashMap(); //枚举真实值 map.put("CODE", be.getValue()); //枚举名称 map.put("NAME", mark.value()); list.add(map); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } return list; } /** * 得到某一个枚举的标识名称 * * @param bse * @return * */ public static String getEnumName(CardCouponsTypeOfCardEnum bse) { try { EnumMark mark = CardCouponsTypeOfCardEnum.class.getField(bse.name()).getAnnotation(EnumMark.class); return mark.value(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return ""; } }
EnumMark.java
<span style="font-size:14px;">package com.brick.dataDictionary.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Target; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 创建EnumMark注解 * * @author wm */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @Documented public @interface EnumMark { /*@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候; 用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中; 用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时, @Target(ElementType.FIELD),注解只能用来修饰类中的field字段 @Target({ElementType.FIELD, ElementType.METHOD}),注解可以用来修饰类的Field和method @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。 */ String value(); } </span>
写完这篇博客,瞬间感觉清晰了很多,这篇博客其实是我另外一篇博客JSTL动态加载单选框--【ssnc】更专业的解决方法。思想类似,但是用枚举更加的专业。枚举应用场景是什么呢? 频繁使用,数据类型一致的一打数据。感激自己,上次有好好总结,才会有此处的共鸣,始终坚信一点,点点滴滴的积累,会成就不一样的自己。