java enum(枚举)使用详解 + 总结
轉(zhuǎn):http://www.cnblogs.com/hyl8218/p/5088287.html#undefined
?
enum 的全稱為 enumeration, 是 JDK 1.5? 中引入的新特性,存放在 java.lang 包中。
??? 下面是我在使用 enum 過程中的一些經(jīng)驗和總結(jié),主要包括如下內(nèi)容:
1.?原始的接口定義常量
2.?語法(定義)
3.?遍歷、switch 等常用操作
4.?enum 對象的常用方法介紹
5.?給 enum 自定義屬性和方法
6.?EnumSet,EnumMap 的應(yīng)用
7.?enum 的原理分析
8.?總結(jié)
原始的接口定義常量
| public?interface?IConstants { ????String MON = "Mon"; ????String TUE = "Tue"; ????String WED = "Wed"; ????String THU = "Thu"; ????String FRI = "Fri"; ????String SAT = "Sat"; ????String SUN = "Sun"; } |
語法(定義)
??? 創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式?Class Enum<E extends Enum<E>>,而?E?表示枚舉類型的名稱。枚舉類型的每一個值都將映射到?protected Enum(String name, int ordinal)?構(gòu)造函數(shù)中,在這里,每個值的名稱都被轉(zhuǎn)換成一個字符串,并且序數(shù)設(shè)置表示了此設(shè)置被創(chuàng)建的順序。
| package?com.hmw.test; /** ?* 枚舉測試類 ?* @author <a href="mailto:hemingwang0902@126.com">何明旺</a> ?*/ public?enum?EnumTest { ????MON, TUE, WED, THU, FRI, SAT, SUN; } |
這段代碼實際上調(diào)用了7次 Enum(String name, int ordinal):
| new?Enum<EnumTest>("MON",0); new?Enum<EnumTest>("TUE",1); new?Enum<EnumTest>("WED",2); ????... ... |
遍歷、switch 等常用操作
對enum進行遍歷和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 對象的常用方法介紹
int?compareTo(E o)?
????????? 比較此枚舉與指定對象的順序。
Class<E>?getDeclaringClass()?
????????? 返回與此枚舉常量的枚舉類型相對應(yīng)的 Class 對象。
String?name()?
????????? 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
int?ordinal()?
????????? 返回枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量序數(shù)為零)。
String?toString()
?????????? 返回枚舉常量的名稱,它包含在聲明中。
static?<T extends Enum<T>> T?valueOf(Class<T> enumType, String name)?
????????? 返回帶指定名稱的指定枚舉類型的枚舉常量。
| public?class?Test { ????public?static?void?main(String[] args) { ????????EnumTest test = EnumTest.TUE; ????????? ????????//compareTo(E o) ????????switch?(test.compareTo(EnumTest.MON)) { ????????case?-1: ????????????System.out.println("TUE 在 MON 之前"); ????????????break; ????????case?1: ????????????System.out.println("TUE 在 MON 之后"); ????????????break; ????????default: ????????????System.out.println("TUE 與 MON 在同一位置"); ????????????break; ????????} ????????? ????????//getDeclaringClass() ????????System.out.println("getDeclaringClass(): "?+ test.getDeclaringClass().getName()); ????????? ????????//name() 和? toString() ????????System.out.println("name(): "?+ test.name()); ????????System.out.println("toString(): "?+ test.toString()); ????????? ????????//ordinal(), 返回值是從 0 開始 ????????System.out.println("ordinal(): "?+ test.ordinal()); ????} } |
輸出結(jié)果:
| TUE 在 MON 之后 getDeclaringClass(): com.hmw.test.EnumTest name(): TUE toString(): TUE ordinal(): 1 |
給 enum 自定義屬性和方法
給 enum 對象加一下 value 的屬性和 getValue() 的方法:
| package?com.hmw.test; /** ?* 枚舉測試類 ?* ?* @author <a href="mailto:hemingwang0902@126.com">何明旺</a> ?*/ public?enum?EnumTest { ????MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { ????????@Override ????????public?boolean?isRest() { ????????????return?true; ????????} ????}, ????SUN(0) { ????????@Override ????????public?boolean?isRest() { ????????????return?true; ????????} ????}; ????private?int?value; ????private?EnumTest(int?value) { ????????this.value = value; ????} ????public?int?getValue() { ????????return?value; ????} ????public?boolean?isRest() { ????????return?false; ????} } |
| public?class?Test { ????public?static?void?main(String[] args) { ????????System.out.println("EnumTest.FRI 的 value = "?+ EnumTest.FRI.getValue()); ????} } |
輸出結(jié)果:
| EnumTest.FRI 的 value = 5 |
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()); ????????} ????} } |
原理分析
??????? enum 的語法結(jié)構(gòu)盡管和 class 的語法不一樣,但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個class文件。該class文件經(jīng)過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum<E>。EnumTest 經(jīng)過反編譯(javap com.hmw.test.EnumTest?命令)之后得到的內(nèi)容如下:
| public?class?com.hmw.test.EnumTest extends?java.lang.Enum{ ????public?static?final?com.hmw.test.EnumTest MON; ????public?static?final?com.hmw.test.EnumTest TUE; ????public?static?final?com.hmw.test.EnumTest WED; ????public?static?final?com.hmw.test.EnumTest THU; ????public?static?final?com.hmw.test.EnumTest FRI; ????public?static?final?com.hmw.test.EnumTest SAT; ????public?static?final?com.hmw.test.EnumTest SUN; ????static?{}; ????public?int?getValue(); ????public?boolean?isRest(); ????public?static?com.hmw.test.EnumTest[] values(); ????public?static?com.hmw.test.EnumTest valueOf(java.lang.String); ????com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest); } |
所以,實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。
總結(jié)
??? 可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關(guān)鍵字繼承其他類,因為 enum 已經(jīng)繼承了 java.lang.Enum(java是單一繼承)。
?
我的一個測試:
package com.iclnetwork.test;public enum EnumTest {red("hong",5,6),green("lv",6,8),blue("lan",7,9);private String name2 ;private int index2 ;private int code ;private EnumTest( String name2 , int index2, int code ){this.name2 = name2 ;this.index2 = index2 ;this.code = code ;}public static void main(String[] args) {System.out.println(EnumTest.red.getname2());System.out.println(EnumTest.red.compareTo(red));System.out.println(red.getDeclaringClass().getName());System.out.println(red.name());System.out.println(blue.ordinal());System.out.println(green.toString());System.out.println(EnumTest.valueOf("red"));System.out.println(red.index2);}public String getname2() {return name2;}public void setname2(String name2) {this.name2 = name2;}public int getindex2() {return index2;}public void setindex2(int index2) {this.index2 = index2;}}?
轉(zhuǎn)載于:https://www.cnblogs.com/jr1260/p/6489537.html
總結(jié)
以上是生活随笔為你收集整理的java enum(枚举)使用详解 + 总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《怎样成为一个高手》观后感
- 下一篇: Linux 搭建Zookeeper集群