之前对于枚举只是稍有印象,这次做金融项目中,用到了枚举,感觉很简单,也很好玩。
什么是枚举呢?
枚举是一种类型,用来定义一组取值范围固定的变量。例如,表示性别的: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】更专业的解决方法。思想类似,但是用枚举更加的专业。枚举应用场景是什么呢? 频繁使用,数据类型一致的一打数据。感激自己,上次有好好总结,才会有此处的共鸣,始终坚信一点,点点滴滴的积累,会成就不一样的自己。