Java枚举--【hope】

  之前对于枚举只是稍有印象,这次做金融项目中,用到了枚举,感觉很简单,也很好玩。


什么是枚举呢?

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








你可能感兴趣的:(java,枚举)