參考文章 https://blog.csdn.net/javazejian/article/details/71333103
參考書籍 effective java》
原理闡述
使用關(guān)鍵字enum創(chuàng)建枚舉類型并編譯后摄狱,編譯器會(huì)為我們生成一個(gè)類鸳吸,這個(gè)類繼承了Java API中的java.lang.Enum類割去。
這個(gè)類繼承了Java API中的java.lang.Enum類,編譯器會(huì)自動(dòng)添加方法杜耙、生成枚舉實(shí)例樊拓。
整體的感受是典勇,編譯器做了這樣的事情: 建造單例枚舉值蝶糯,用數(shù)組來容納這些枚舉值。
常見用法
1.常量
2.switch
3.實(shí)現(xiàn)接口
4.接口組合枚舉
5.定義抽象方法
6.單例模式
7.枚舉集合EnumSet和EnumMap
代碼演示
- 演示枚舉原理
比如一個(gè)java class是這樣
enum PeriodApply {
APPLY_INPROCESS("1", "申請(qǐng)中"),
APPLY_FAILED("2", "申請(qǐng)失敗"),
APPLY_SUCCESSFULLY("3", "申請(qǐng)成功"),
;
private String code;
private String desc;
PeriodApply(String code, String desc) {
this.code = code;
this.desc = desc;
}
}
編譯過后的代碼其實(shí)是這樣:
final class PeriodPay extends Enum {
private PeriodPay(String s, int i, String code, String desc)
{
super(s, i);
this.code = code;
this.desc = desc;
}
public static final PeriodPay PAY_INPROCESS;
public static final PeriodPay PAY_FAILED;
public static final PeriodPay PAY_SUCCESSFULLY;
private String code;
private String desc;
static
{
PAY_INPROCESS = new PeriodPay("PAY_INPROCESS", 0, "1", "申請(qǐng)中");
PAY_FAILED = new PeriodPay("PAY_FAILED", 1, "2", "申請(qǐng)失敗");
PAY_SUCCESSFULLY = new PeriodPay("PAY_SUCCESSFULLY", 2, "2", "申請(qǐng)成功");
}
}
- 演示接口組合枚舉1
public enum EnumMeal {
APPETIZER(Food.Appetizer.class),
MAINCOURSE(Food.MainCourse.class),
;
private Food[] values;
private EnumMeal(Class<? extends Food> kind) {
//通過class對(duì)象獲取枚舉實(shí)例
values = kind.getEnumConstants();
}
public Food[] getValues() {
return values;
}
public void setValues(Food[] values) {
this.values = values;
}
public static void main(String[] args) {
System.out.println("開胃菜:" + Arrays.toString(APPETIZER.getValues()));
}
public interface Food {
enum Appetizer implements Food {
SALAD, SOUP, SPRING_ROLLS;
}
enum MainCourse implements Food {
LASAGNE, BURRITO, PAD_THAI,
LENTILS, HUMMOUS, VINDALOO;
}
}
}
- 演示接口組合枚舉2
場(chǎng)景:
申請(qǐng)狀態(tài)的枚舉划乖,A業(yè)務(wù)和B業(yè)務(wù)關(guān)心的枚舉粗細(xì)程度不一樣贬养,A關(guān)心申請(qǐng)失敗或成功,B不僅關(guān)心成功失敗琴庵,還要關(guān)心是因?yàn)槭裁丛蚴 ?/p>
名稱 | 申請(qǐng)中 | 申請(qǐng)成功 | 申請(qǐng)失敗 |
---|---|---|---|
A業(yè)務(wù) | 申請(qǐng)中 | 申請(qǐng)成功 | 申請(qǐng)失敗 |
B業(yè)務(wù) | 上級(jí)領(lǐng)導(dǎo)已審批 CTO已審批 |
申請(qǐng)成功 | 上級(jí)領(lǐng)導(dǎo)駁回失敗 CTO駁回失敗 |
上級(jí)領(lǐng)導(dǎo)已審批 和 CTO已審批 都是屬于申請(qǐng)中的狀態(tài)误算,
上級(jí)領(lǐng)導(dǎo)駁回失敗 和 CTO駁回失敗 都是屬于申請(qǐng)失敗的狀態(tài)
將所有情況列在同一個(gè)枚舉類中,枚舉中增加新的標(biāo)志PeriodI迷殿,來表明枚舉值的分類儿礼。
public enum EnumBH {
APPLY_LEADER_PASS("101", "上級(jí)領(lǐng)導(dǎo)已審批", PeriodApply.APPLY_INPROCESS),
APPLY_CTO_PASS("102", "CTO已審批", PeriodApply.APPLY_INPROCESS),
APPLY_LEADER_REJECT("200", "上級(jí)領(lǐng)導(dǎo)駁回失敗", PeriodApply.APPLY_FAILED),
APPLY_CTO_REJECT("201", "CTO駁回失敗", PeriodApply.APPLY_FAILED),
APPLY_SUCCESSFULLY("300", "申請(qǐng)成功", PeriodApply.APPLY_SUCCESSFULLY),
PAY_CONFIRMING("300", "收款方確認(rèn)中", PeriodPay.PAY_INPROCESS),
PAY_CC_NOT_ENOUGH("300", "信用卡額度不足", PeriodPay.PAY_FAILED),
PAY_BC_NOT_ENOUGH("300", "銀行卡余額不足", PeriodPay.PAY_FAILED),
PAY_SUCCESSFULLY("300", "支付成功", PeriodPay.PAY_SUCCESSFULLY),
;
private String code;
private String desc;
private PeriodI periodI;
EnumBH(String code, String desc, PeriodI periodI) {
this.code = code;
this.desc = desc;
this.periodI = periodI;
}
}
interface PeriodI {
}
enum PeriodPay implements PeriodI {
PAY_INPROCESS("1", "支付中"),
PAY_FAILED("2", "支付失敗"),
PAY_SUCCESSFULLY("2", "支付成功"),
;
}
enum PeriodApply implements PeriodI {
APPLY_INPROCESS("1", "申請(qǐng)中"),
APPLY_FAILED("2", "申請(qǐng)失敗"),
APPLY_SUCCESSFULLY("3", "申請(qǐng)成功"),
;
}