【java基礎】--Java列舉

ZeroWM發表於2016-03-03

  之前對於列舉只是稍有印象,這次做金融專案中,用到了列舉,感覺很簡單,也很好玩。


什麼是列舉呢?

  列舉是一種型別,用來定義一組取值範圍固定的變數。例如,表示性別的: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】更專業的解決方法。思想類似,但是用列舉更加的專業。列舉應用場景是什麼呢? 頻繁使用,資料型別一致的一打資料。感激自己,上次有好好總結,才會有此處的共鳴,始終堅信一點,點點滴滴的積累,會成就不一樣的自己。








相關文章