更新時間:2020-07-08 來源:黑馬程序員 瀏覽量:
1.1 什么是枚舉
Java 1.5引入了一個新特性,枚舉!枚舉的本質(zhì)是一個類,用于定義靜態(tài)常量;
枚舉類特點:
·枚舉類用特有關(guān)鍵字enum修飾的類,本質(zhì)是類,很特殊的類
·類不能被創(chuàng)建new對象,不能被繼承
·枚舉類中寫的都是成員變量
·【原理】枚舉類中,成員變量被final和static修飾,默認的,不用寫
1.2 開發(fā)時,如何使用枚舉?
/**
* 返回給用戶,信息枚舉類
*/
public enum MessageEnum {
ACTION_SUCCESS("操作成功"),
ACTION_FAIL("操作失敗"),
DELETE_CHECKITEM_FAIL("刪除檢查項失敗"),
DELETE_CHECKITEM_SUCCESS("刪除檢查項成功"),
ADD_CHECKITEM_SUCCESS("新增檢查項成功"),
ADD_CHECKITEM_FAIL("新增檢查項失敗"),
EDIT_CHECKITEM_FAIL("編輯檢查項失敗"),
EDIT_CHECKITEM_SUCCESS("編輯檢查項成功"),
QUERY_CHECKITEM_SUCCESS("查詢檢查項成功"),
QUERY_CHECKITEM_FAIL("查詢檢查項失敗"),
UPLOAD_SUCCESS("上傳成功"),
ADD_CHECKGROUP_FAIL("新增檢查組失敗"),
ADD_CHECKGROUP_SUCCESS("新增檢查組成功"),
DELETE_CHECKGROUP_FAIL("刪除檢查組失敗"),
DELETE_CHECKGROUP_SUCCESS("刪除檢查組成功"),
QUERY_CHECKGROUP_SUCCESS("查詢檢查組成功"),
QUERY_CHECKGROUP_FAIL("查詢檢查組失敗"),
EDIT_CHECKGROUP_FAIL("編輯檢查組失敗"),
EDIT_CHECKGROUP_SUCCESS("編輯檢查組成功"),
PIC_UPLOAD_SUCCESS("圖片上傳成功"),
PIC_UPLOAD_FAIL("圖片上傳失敗"),
ADD_SETMEAL_FAIL("新增套餐失敗"),
ADD_SETMEAL_SUCCESS("新增套餐成功"),
IMPORT_ORDERSETTING_FAIL("批量導入預約設置數(shù)據(jù)失敗"),
IMPORT_ORDERSETTING_SUCCESS("批量導入預約設置數(shù)據(jù)成功"),
GET_ORDERSETTING_SUCCESS("獲取預約設置數(shù)據(jù)成功"),
GET_ORDERSETTING_FAIL("獲取預約設置數(shù)據(jù)失敗"),
ORDERSETTING_SUCCESS("預約設置成功"),
ORDERSETTING_FAIL("預約設置失敗"),
ADD_MEMBER_FAIL("新增會員失敗"),
ADD_MEMBER_SUCCESS("新增會員成功"),
DELETE_MEMBER_FAIL("刪除會員失敗"),
DELETE_MEMBER_SUCCESS("刪除會員成功"),
EDIT_MEMBER_FAIL("編輯會員失敗"),
EDIT_MEMBER_SUCCESS("編輯會員成功"),
TELEPHONE_VALIDATECODE_NOTNULL("手機號和驗證碼都不能為空"),
LOGIN_SUCCESS("登錄成功"),
VALIDATECODE_ERROR("驗證碼輸入錯誤"),
QUERY_ORDER_SUCCESS("查詢預約信息成功"),
QUERY_ORDER_FAIL("查詢預約信息失敗"),
QUERY_SETMEALLIST_SUCCESS("查詢套餐列表數(shù)據(jù)成功"),
QUERY_SETMEALLIST_FAIL("查詢套餐列表數(shù)據(jù)失敗"),
QUERY_SETMEAL_SUCCESS("查詢套餐數(shù)據(jù)成功"),
QUERY_SETMEAL_FAIL("查詢套餐數(shù)據(jù)失敗"),
SEND_VALIDATECODE_FAIL("驗證碼發(fā)送失敗"),
SEND_VALIDATECODE_SUCCESS("驗證碼發(fā)送成功"),
SELECTED_DATE_CANNOT_ORDER("所選日期不能進行體檢預約"),
ORDER_FULL("預約已滿"),
HAS_ORDERED("不能重復預約"),
ORDER_SUCCESS("預約成功"),
GET_USERNAME_SUCCESS("獲取當前登錄用戶名稱成功"),
GET_USERNAME_FAIL("獲取當前登錄用戶名稱失敗"),
GET_MENU_SUCCESS("獲取當前登錄用戶菜單成功"),
GET_MENU_FAIL("獲取當前登錄用戶菜單失敗"),
GET_MEMBER_NUMBER_REPORT_SUCCESS("獲取會員統(tǒng)計數(shù)據(jù)成功"),
GET_MEMBER_NUMBER_REPORT_FAIL("獲取會員統(tǒng)計數(shù)據(jù)失敗"),
GET_SETMEAL_COUNT_REPORT_SUCCESS("獲取套餐統(tǒng)計數(shù)據(jù)成功"),
GET_SETMEAL_COUNT_REPORT_FAIL("獲取套餐統(tǒng)計數(shù)據(jù)失敗"),
GET_BUSINESS_REPORT_SUCCESS("獲取運營統(tǒng)計數(shù)據(jù)成功"),
GET_BUSINESS_REPORT_FAIL("獲取運營統(tǒng)計數(shù)據(jù)失敗"),
GET_SETMEAL_LIST_SUCCESS("查詢套餐列表數(shù)據(jù)成功"),
GET_SETMEAL_LIST_FAIL("查詢套餐列表數(shù)據(jù)失敗"),
SETMEAL_GET_TOKEN("套餐獲取TOKEN成功"),
ADD_IMGNAME_REDI("添加圖片名稱到Redis成功");
private final String msg;
MessageEnum(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
/**
* 返回信息封裝對象Result
*/
public class Result implements Serializable {
private boolean flag;//執(zhí)行結(jié)果,true為執(zhí)行成功 false為執(zhí)行失敗
private String message;//返回結(jié)果信息
private Object data;//返回數(shù)據(jù)
//Getter、Setter、toString、空參構(gòu)造、滿參構(gòu)造
}
/**
* 1. 獲取客戶端手機號及驗證碼
* 2. 根據(jù)手機號獲取redis驗證碼
* 3. 判斷用戶驗證碼與redis驗證碼是否匹配
* 1. 如果匹配失敗,返回驗證碼錯誤
* 2.如果成功,根據(jù)手機號獲取會員信息
* 1. 如果有會員,登錄成功
* 2. 如果不是會員,封裝Member對象,調(diào)用Service保存
* @param map
* @return
*/
@RequestMapping("/check")
public Result check(@RequestBody Map<String,String> map){
log.debug("LoginController: check: " + map);
// 獲取客戶端手機號及驗證碼
String telephone = map.get("telephone");
String validateCode = map.get("validateCode");
// 讀取Redis驗證碼
String codeInRedis = jedisPool.getResource().get(telephone+ "-"+ RedisConst.SENDTYPE_LOGIN);
if(codeInRedis == null || codeInRedis.length()==0 ){
return new Result(false, MessageEnum.TELEPHONE_VALIDATECODE_NOTNULL.getMsg());
}
if ( !codeInRedis.equals(validateCode) ){
return new Result(false, MessageEnum.VALIDATECODE_ERROR.getMsg());
}
memberService.saveOrEdit(telephone);
log.debug("登錄成功, 保存會員信息成功?。?!");
return new Result(true, MessageEnum.LOGIN_SUCCESS.getMsg());
}
/**
* 1. 獲取客戶端手機號及驗證碼
* 2. 根據(jù)手機號獲取redis驗證碼
* 3. 判斷用戶驗證碼與redis驗證碼是否匹配
* 1. 如果匹配失敗,返回驗證碼錯誤
* 2.如果成功,根據(jù)手機號獲取會員信息
* 1. 如果有會員,登錄成功
* 2. 如果不是會員,封裝Member對象,調(diào)用Service保存
* @param map
* @return
*/
@RequestMapping("/check")
public Result checkAge(@RequestBody Map<String,String> map){
log.debug("LoginController: check: " + map);
// 獲取客戶端手機號及驗證碼
String telephone = map.get("telephone");
String validateCode = map.get("validateCode");
// 讀取Redis驗證碼
String codeInRedis = jedisPool.getResource().get(telephone+ "-"+ RedisConst.SENDTYPE_LOGIN);
if(codeInRedis == null || codeInRedis.length()==0 ){
return new Result(false, "驗證碼輸入不能為空");
}
if ( !codeInRedis.equals(validateCode) ){
return new Result(false, "驗證碼輸入錯誤");
}
memberService.saveOrEdit(telephone);
log.debug("登錄成功, 保存會員信息成功?。。?quot;);
return new Result(true, "登錄成功");
}
1.3 沒有枚舉之前,怎么做的?
·第一階段:在類的方法中
·缺陷問題:開發(fā)不可能只一個類!
·不能復用
·"大海撈針式"修改局部變量
·無法統(tǒng)一維護系統(tǒng)局部變量
public class WeekValue {
public static void main(String[] args) {
//第一階段:定義局部變量,字面值
String one = "星期1";
String one1 = "星期一";
String two = "星期二";
String three = "星期三";
String four = "星期四";
String five = "星期五";
String six = "星期六";
String seven = "星期七";
//性別
String man = "男";
String women = "女";
//顏色
String red = "紅色";
String yellow = "黃色";
String green = "綠色";
//狀態(tài)
String save = "新增成功";
String update = "修改成功";
String del = "刪除成功";
String find = "查詢成功";
}
}
第二階段:在類的常量,靜態(tài)static和final修飾
解決問題:
·不能復用
·"大海撈針式"修改局部變量
·缺陷問題:
·不能統(tǒng)一維護系統(tǒng)局部變量
·不遵循類單一職責原則
public class WeekValue {
public static final String ONE = "星期一";
public static final String ONE1 = "星期一";
public static final String TWO = "星期二";
public static final String THREE = "星期三";
public static final String FOUR = "星期四";
public static final String FIVE = "星期五";
public static final String SIX = "星期六";
public static final String SEVEN = "星期七";
//性別
public static final String MAN = "男";
public static final String WOMEN = "女";
//顏色
public static final String RED = "紅色";
public static final String YELLOW = "黃色";
public static final String GREEN = "綠色";
//狀態(tài)
public static final String SAVE = "新增成功";
public static final String UPDATE = "修改成功";
public static final String DEL = "刪除成功";
public static final String FIND = "查詢成功";
}
第三階段:在靜態(tài)常量類中
解決問題:
·不能復用
·"大海撈針式"修改局部變量
·不能統(tǒng)一維護系統(tǒng)局部變量
·不遵循類單一職責原則
缺陷問題:
·對自定義類型對象常量支持不是很好,不太好擴展
·類職責,從設計的角度,沒有劃清界限!有些智障男孩, 總是會用靜態(tài)常量類去創(chuàng)建對象,或在靜態(tài)常量類中寫業(yè)務代碼!
/**
* 返回給用戶,信息枚舉類
*/
public class MessageEnum {
public static final String GET_BUSINESS_REPORT_SUCCESS = "獲取運營統(tǒng)計數(shù)據(jù)成功";
public static final String GET_BUSINESS_REPORT_FAIL = "獲取運營統(tǒng)計數(shù)據(jù)失敗";
public static final String GET_SETMEAL_LIST_SUCCESS = "查詢套餐列表數(shù)據(jù)成功";
public static final String GET_SETMEAL_LIST_FAIL = "查詢套餐列表數(shù)據(jù)失敗";
public static final String SETMEAL_GET_TOKEN = "套餐獲取TOKEN成功";
public static final String ADD_IMGNAME_REDI = "添加圖片名稱到Redis成功";
//.....
}
1.4 枚舉原理解析
枚舉的出現(xiàn)解決了之前常量定義的諸多問題:
解決問題:
·不能復用
·"大海撈針式"修改局部變量
·不能統(tǒng)一維護系統(tǒng)局部變量
·不遵循類單一職責原則
·對自定義類型對象常量支持不是很好,不太好擴展
·類職責,從設計的角度,沒有劃清界限!有些智障男孩, 總是會用靜態(tài)常量類去創(chuàng)建對象,或在靜態(tài)常量類中寫業(yè)務代碼!
·枚舉類不能創(chuàng)建對象
·枚舉類不能繼承
public enum WeekEnum {
MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
枚舉!枚舉的本質(zhì)是一個類,用于定義靜態(tài)常量;我們可以通過反編譯WeekEnum.class字節(jié)碼文件,過濾掉編譯器"語法糖",就是看到枚舉的本來面目,其實就一個類;
反編譯工具jad.exe,反編譯命令:
jad -sjava WeekEnum.class
WeekEnum枚舉類,反編譯后的java文件;證明枚舉類是個final修飾,內(nèi)含常量的類
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: WeekEnum.java
public final class WeekEnum extends Enum
{
public static WeekEnum[] values()
{
return (WeekEnum[])$VALUES.clone();
}
public static WeekEnum valueOf(String name)
{
return (WeekEnum)Enum.valueOf(WeekEnum, name);
}
private WeekEnum(String s, int i)
{
super(s, i);
}
public static final WeekEnum MONDAY;
public static final WeekEnum TUESDAY;
public static final WeekEnum WEDNESDAY;
public static final WeekEnum THURSDAY;
public static final WeekEnum FRIDAY;
public static final WeekEnum SATURDAY;
public static final WeekEnum SUNDAY;
private static final WeekEnum $VALUES[];
static
{
MONDAY = new WeekEnum("MONDAY", 0);
TUESDAY = new WeekEnum("TUESDAY", 1);
WEDNESDAY = new WeekEnum("WEDNESDAY", 2);
THURSDAY = new WeekEnum("THURSDAY", 3);
FRIDAY = new WeekEnum("FRIDAY", 4);
SATURDAY = new WeekEnum("SATURDAY", 5);
SUNDAY = new WeekEnum("SUNDAY", 6);
$VALUES = (new WeekEnum[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
});
}
}
猜你喜歡:
Java中級程序員培訓課程