【java基礎】--Java列舉
之前對於列舉只是稍有印象,這次做金融專案中,用到了列舉,感覺很簡單,也很好玩。
什麼是列舉呢?
列舉是一種型別,用來定義一組取值範圍固定的變數。例如,表示性別的: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基礎】列舉Java
- Java基礎--列舉Java
- ?Java基礎之Java列舉Java
- java基礎(十一) 列舉型別Java型別
- Java基礎(十)——列舉與註解Java
- Java基礎教程(15)–列舉型別Java型別
- Java列舉Java
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- java列舉類Java
- Java 列舉(enum)Java
- 【Java基礎知識】Java陣列與集合Java陣列
- java中的列舉Java
- Java列舉解讀Java
- 【java】【列舉使用技巧】Java
- Java(4)列舉類Java
- JAVA基礎--二維陣列Java陣列
- 再談java列舉enumJava
- java_06列舉類Java
- Java - Enum 列舉型別Java型別
- Java 列舉 enum 詳解Java
- Java —— 列舉類(enum 類)Java
- Java 列舉 switch的用法Java
- 深入理解 Java 列舉Java
- java基礎(十) 陣列型別Java陣列型別
- JavaSE基礎:列舉型別Java型別
- 一文了解java列舉Java
- java中的列舉型別Java型別
- Java雙屬性列舉使用Java
- Java 集合列舉泛型(一)Java泛型
- 零基礎學Java(8)陣列Java陣列
- Java列舉-通過值查詢對應的列舉Java
- Java enum列舉類詳解 列舉的常見用法Java
- Java核心基礎第4篇-Java陣列的常規操作Java陣列
- 迴歸Java基礎:LinkedBlockingQueue阻塞佇列解析JavaBloC佇列
- java基礎Java
- [Java基礎]Java
- JAVA 基礎Java
- Java列舉類、註解和反射Java反射
- 聊一聊Java的列舉enumJava