java enum枚举的使用详情(实例与原理分析)
一、原始的接口定義常量
public interface IConstants {String MON = "Mon";String TUE = "Tue";String WED = "Wed";String THU = "Thu";String FRI = "Fri";String SAT = "Sat";String SUN = "Sun"; }二、語(yǔ)法(定義)
創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個(gè)抽象類)。枚舉類型符合通用模式 Class Enum<E extends Enum>,而 E 表示枚舉類型的名稱。枚舉類型的每一個(gè)值都將映射到 protected Enum(String name, int ordinal) 構(gòu)造函數(shù)中,在這里,每個(gè)值的名稱都被轉(zhuǎn)換成一個(gè)字符串,并且序數(shù)設(shè)置表示了此設(shè)置被創(chuàng)建的順序。
package com.sihai.test; /*** 枚舉測(cè)試類* @author */ public enum EnumTest {MON, TUE, WED, THU, FRI, SAT, SUN; }這段代碼實(shí)際上調(diào)用了7次 Enum(String name, int ordinal): new Enum<EnumTest>("MON",0); new Enum<EnumTest>("TUE",1); new Enum<EnumTest>("WED",2);三、遍歷、switch 等常用操作
對(duì)enum進(jìn)行遍歷和switch的操作示例代碼:
public class Test {public static void main(String[] args) {for (EnumTest e : EnumTest.values()) {System.out.println(e.toString());}System.out.println("----------------我是分隔線------------------");EnumTest test = EnumTest.TUE;switch (test) {case MON:System.out.println("今天是星期一");break;case TUE:System.out.println("今天是星期二");break;// ... ...default:System.out.println(test);break;}} }輸出結(jié)果:
MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔線------------------
今天是星期二
四、enum 對(duì)象的常用方法介紹
int compareTo(E o)
比較此枚舉與指定對(duì)象的順序。
Class getDeclaringClass()
返回與此枚舉常量的枚舉類型相對(duì)應(yīng)的 Class 對(duì)象。
String name()
返回此枚舉常量的名稱,在其枚舉聲明中對(duì)其進(jìn)行聲明。
int ordinal()
返回枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量序數(shù)為零)。
String toString()
返回枚舉常量的名稱,它包含在聲明中。
輸出結(jié)果:
TUE 在 MON 之后
getDeclaringClass(): com.sihai.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
給 enum 自定義屬性和方法
五、EnumSet,EnumMap 的應(yīng)用
public class Test {public static void main(String[] args) {// EnumSet的使用EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);for (EnumTest day : weekSet) {System.out.println(day);}// EnumMap的使用EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);weekMap.put(EnumTest.MON, "星期一");weekMap.put(EnumTest.TUE, "星期二");// ... ...for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {Entry<EnumTest, String> entry = iter.next();System.out.println(entry.getKey().name() + ":" + entry.getValue());}} }六、舉例
有構(gòu)造方法的枚舉類(構(gòu)造方法有一個(gè)參數(shù)),下面是比較常用的一種方式:
/*** 任務(wù)狀態(tài)枚舉類* Created by sihaion 2017/4/27.*/ public enum TaskStatusEnum {NotStart(0), //未開始Doing(1), //執(zhí)行中Pause(2), //暫停Completed(3), //已完成Del(4), //刪除CutShort(5) ; //提前結(jié)束private int value;TaskStatusEnum(int value) {this.value=value;}public int getValue(){return value;}/*** 根據(jù)value返回對(duì)應(yīng)的枚舉值* @param value* @return*/public static TaskStatusEnum valueOf(int value) {switch (value) {case 0: return NotStart;case 1: return Doing;case 2: return Pause;case 3: return Completed;case 4: return Del;case 5: return CutShort;default: return null;}} }訂單狀態(tài)枚舉類:
/*** 訂單狀體枚舉類* Created by sihaion 2017/5/1.*/ public enum OrderStatus {WaitPay(0), //等待支付Paid(1), //已經(jīng)支付Expired(2), //已經(jīng)失效Force(3); //已經(jīng)生效private int value;OrderStatus(int value) {this.value=value;}public int getValue(){return value;}public static OrderStatus valueOf(int value) {switch (value) {case 0:return WaitPay;case 1:return Paid;case 2:return Expired;case 3:return Force;default:return null;}} }消息狀態(tài)枚舉類:
/*** 消息狀態(tài)枚舉類* Created by sihaion 2017/5/1.*/ public enum MessageStatus {Read(1),//已讀UnRead(0);//未讀private int value;MessageStatus(int value) {this.value=value;}public int getValue(){return value;}public static MessageStatus valueOf(int value) {switch (value) {case 1:return Read;case 0:return UnRead;default:return null;}} }月份的枚舉類:
/*** 月份枚舉類* Created by sihaion 2017/5/1.*/ public enum MonthEnum {Jan(1),Feb(2),Mar(3),Apr(4),May(5),Jun(6),Jul(7),Aug(8),Sep(9),Oct(10),Nov(11),Dec(12);private Integer index;public Integer getIndex() {return index;}MonthEnum(Integer index) {this.index = index;}/*** 根據(jù)索引獲取對(duì)應(yīng)的枚舉對(duì)象* @param index* @return*/public static MonthEnum getEnumTypeByIndex(Integer index) {MonthEnum[] values = MonthEnum.values();for (MonthEnum value : values) {if (value.getIndex() == index) {return value;}}return null;} }用法舉例:
/*** Created by sihaion 2017/4/30.*/ public class AppTest {public static void main(String[] args) {Integer index = MonthEnum.Apr.getIndex();//輸出: Apr這個(gè)枚舉值對(duì)應(yīng)的索引為: 4System.out.println("Apr這個(gè)枚舉值對(duì)應(yīng)的索引為:\t" + index);//輸出: 索引4對(duì)應(yīng)的枚舉值為: AprMonthEnum monthEnum = MonthEnum.getEnumTypeByIndex(4);System.out.println("索引4對(duì)應(yīng)的枚舉值為:\t" + monthEnum.name());} }注意:
-
枚舉中的所有構(gòu)造方法都必須是private修飾,如果不加任何修飾符,默認(rèn)就是private修飾。
-
枚舉類中定義的工具方法getEnumTypeByIndex()使用static修飾,這樣才能通過(guò)MonthEnum.getEnumTypeByIndex(4)的方式來(lái)調(diào)用。
枚舉類的構(gòu)造方法有兩個(gè)參數(shù)的情況:
import java.util.HashMap; import java.util.Map;/*** 星期枚舉類* Created by sihaion 2017/5/1.*/ public enum WeekDayEnum {SUN(0, "星期日"),MON(1, "星期一"),TUE(2, "星期二"),WED(3, "星期三"),THUR(4, "星期四"),FRI(5, "星期五"),SAT(6, "星期六");private Integer index;private String key;WeekDayEnum(Integer index, String key) {this.index = index;this.key = key;}public String getKey() {return key;}public Integer getIndex() {return index;}/*** 根據(jù)枚舉名稱得到key* 比如根據(jù)"WED"得到"星期三"* @param name* @return*/public static String getKeyByName(String name) {WeekDayEnum[] values = WeekDayEnum.values();for (WeekDayEnum value : values) {if (value.name().equals(name)) {return value.getKey();}}return null;}/*** 根據(jù)屬性key獲取屬性index:* 比如根據(jù) "星期三" 得到 3* @param key* @return*/public static Integer getIndexByKey(String key) {for (WeekDayEnum weekDayEnum : WeekDayEnum.values()) {String k = weekDayEnum.getKey();if (k.equals(key)) {return weekDayEnum.getIndex();}}return null;}/*** 根據(jù)屬性index獲取屬性key:* 比如根據(jù) 3 得到 "星期三"* @param index* @return*/public static String getKeyByIndex(Integer index) {for (WeekDayEnum weekDayEnum : WeekDayEnum.values()) {Integer in = weekDayEnum.getIndex();if (in == index) {return weekDayEnum.getKey();}}return null;}/*** 根據(jù)屬性index獲取對(duì)應(yīng)的枚舉值:* 比如根據(jù) 3 得到枚舉值 WED* @param index* @return*/public static WeekDayEnum getTypeByIndex(Integer index) {for (WeekDayEnum value : WeekDayEnum.values()) {if (value.getIndex() == index) {return value;}}return null;}/*** 返回一個(gè)由index和key組成的map集合:* {0=星期日, 1=星期一, 2=星期二, 3=星期三, 4=星期四, 5=星期五, 6=星期六}* @return*/public static Map<Integer, String> getIndexKeyMap() {Map<Integer, String> map = new HashMap<>();for (WeekDayEnum value : WeekDayEnum.values()) {Integer index = value.getIndex();String key = value.getKey();map.put(index, key);}return map;} }用法舉例:
import java.util.Map;/*** Created by sihaion 2017/4/30.*/ public class AppTest {public static void main(String[] args) {Integer index = WeekDayEnum.getIndexByKey("星期日");System.out.println(index);//輸出 0String key = WeekDayEnum.getKeyByIndex(0);System.out.println(key);//輸出 星期日String keyByName = WeekDayEnum.getKeyByName("SAT");System.out.println(keyByName);//輸出 星期六Map<Integer, String> map = WeekDayEnum.getIndexKeyMap();//輸出 {0=星期日, 1=星期一, 2=星期二, 3=星期三, 4=星期四, 5=星期五, 6=星期六}System.out.println(map);} }構(gòu)造方法的參數(shù)有多個(gè)情況:
import java.util.ArrayList; import java.util.List;/*** Created by sihaion 2017/5/1.*/ public enum WeekDayEnumX {SUN(0, "星期日", "Sunday"),MON(1, "星期一", "Monday"),TUE(2, "星期二", "Tuesday"),WED(3, "星期三", "Wednesday"),THUR(4, "星期四", "Thursday"),FRI(5, "星期五", "Friday"),SAT(6, "星期六", "Saturday");private Integer index;//索引private String cn;//中文表示private String en;//英文表示W(wǎng)eekDayEnumX(Integer index, String cn, String en) {this.index = index;this.cn = cn;this.en = en;}public static String getCnByIndex(Integer index) {WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {if (value.index == index) {return value.cn;}}return null;}public static String getEnByIndex(Integer index) {WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {if (value.index == index) {return value.en;}}return null;}/*** 獲取所有的索引list* @return*/public static List<Object> getAllIndex() {List<Object> list = new ArrayList<>();WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {list.add(value.index);}return list;}/*** 將枚舉值中的所有屬性封裝到一個(gè)list集合中* @return*/public static List<List<Object>> getAll() {List<List<Object>> lists = new ArrayList<>();WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {List<Object> elementList = new ArrayList<>();elementList.add(value.name());elementList.add(value.index);elementList.add(value.cn);elementList.add(value.en);lists.add(elementList);}return lists;} }用法舉例:
import java.util.List;/*** Created by sihaion 2017/4/30.*/ public class AppTest {public static void main(String[] args) {List<Object> allIndex = WeekDayEnumX.getAllIndex();System.out.println(allIndex);//輸出 [0, 1, 2, 3, 4, 5, 6]List<List<Object>> allList = WeekDayEnumX.getAll();for (List<Object> list : allList) {/*** 輸出結(jié)果:* * [SUN, 0, 星期日, Sunday]* [MON, 1, 星期一, Monday]* [TUE, 2, 星期二, Tuesday]* [WED, 3, 星期三, Wednesday]* [THUR, 4, 星期四, Thursday]* [FRI, 5, 星期五, Friday]* [SAT, 6, 星期六, Saturday]*/System.out.println(list);}} }帶有抽象方法的枚舉類:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*** Created by sihaion 2017/5/1.*/ public enum WeekDayEM {SUN {@Overridepublic Integer getValue() {return 0;}@Overridepublic String getKey() {return "星期日";}},MON {@Overridepublic Integer getValue() {return 1;}@Overridepublic String getKey() {return "星期一";}},TUE {@Overridepublic Integer getValue() {return 2;}@Overridepublic String getKey() {return "星期二";}},WED {@Overridepublic Integer getValue() {return 3;}@Overridepublic String getKey() {return "星期三";}},THU {@Overridepublic Integer getValue() {return 4;}@Overridepublic String getKey() {return "星期四";}},FRI {@Overridepublic Integer getValue() {return 5;}@Overridepublic String getKey() {return "星期五";}},SAT {@Overridepublic Integer getValue() {return 6;}@Overridepublic String getKey() {return "星期六";}};public abstract Integer getValue();public abstract String getKey();/*** 返回由key和value組成的map集合:* {星期二=2, 星期六=6, 星期三=3, 星期四=4, 星期五=5, 星期日=0, 星期一=1}* @return*/public static Map<String, Object> getKeyValueMap() {HashMap<String, Object> map = new HashMap<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {String k = value.getKey();Integer v = value.getValue();map.put(k, v);}return map;}/*** 返回由所有key組成的list集合:* [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]* @return*/public static List<Object> getAllKey() {List<Object> keyList = new ArrayList<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {String k = value.getKey();keyList.add(k);}return keyList;}/*** 返回由所有value組成的list集合:* [0, 1, 2, 3, 4, 5, 6]* @return*/public static List<Object> getAllValue() {List<Object> valueList = new ArrayList<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {Integer v = value.getValue();valueList.add(v);}return valueList;} }在上面的枚舉類中,定義了兩個(gè)抽象方法:
所以每一個(gè)枚舉值(對(duì)象)都必須實(shí)現(xiàn)這兩個(gè)抽象方法。
用法舉例:
/*** Created by sihaion 2017/4/30.*/ public class AppTest {public static void main(String[] args) {String key = WeekDayEM.THU.getKey();Integer value = WeekDayEM.THU.getValue();//輸出 星期四, 4System.out.println(key + ", " + value);} }七、原理分析
enum 的語(yǔ)法結(jié)構(gòu)盡管和 class 的語(yǔ)法不一樣,但是經(jīng)過(guò)編譯器編譯之后產(chǎn)生的是一個(gè)class文件。該class文件經(jīng)過(guò)反編譯可以看到實(shí)際上是生成了一個(gè)類,該類繼承了java.lang.Enum。EnumTest 經(jīng)過(guò)反編譯(javap com.sihai.test.EnumTest 命令)之后得到的內(nèi)容如下:
public class com.sihai.test.EnumTest extends java.lang.Enum{public static final com.sihai.test.EnumTest MON;public static final com.sihai.test.EnumTest TUE;public static final com.sihai.test.EnumTest WED;public static final com.sihai.test.EnumTest THU;public static final com.sihai.test.EnumTest FRI;public static final com.sihai.test.EnumTest SAT;public static final com.sihai.test.EnumTest SUN;static {};public int getValue();public boolean isRest();public static com.sihai.test.EnumTest[] values();public static com.sihai.test.EnumTest valueOf(java.lang.String);com.sihai.test.EnumTest(java.lang.String, int, int, com.sihai.test.EnumTest); }所以,實(shí)際上 enum 就是一個(gè) class,只不過(guò) java 編譯器幫我們做了語(yǔ)法的解析和編譯而已。
八、總結(jié)
可以把 enum 看成是一個(gè)普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關(guān)鍵字繼承其他類,因?yàn)?enum 已經(jīng)繼承了 java.lang.Enum(java是單一繼承)。
總結(jié)
以上是生活随笔為你收集整理的java enum枚举的使用详情(实例与原理分析)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序Java登录流程(ssm实现具
- 下一篇: 微信小程序Java登录流程(ssm实现具