說來慚愧,一直沒有怎麼使用過列舉,只知道可以定義日期中的星期幾,沒有用到也就沒有學習,現在還是覺得應該認真瞭解下,在可以用到的時候也會發現原來列舉也可以解決這個問題。廢話不多說了,詳細在下面:
原始的介面定義常量
public interface IConstants String "Mon" ; String "Tue" ; String "Wed" ; String "Thu" ; String "Fri" ; String "Sat" ; String "Sun" ; } |
語法(定義)
建立列舉型別要使用 enum 關鍵字,隱含了所建立的型別都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。列舉型別符合通用模式 Class Enum<E extends Enum<E>>
,而 E
表示列舉型別的名稱。列舉型別的每一個值都將對映到 protected
建構函式中,在這裡,每個值的名稱都被轉換成一個字串,並且序數設定表示了此設定被建立的順序。
Enum(String name, int ordinal)
package com.hmw.test; /** * * */ public enum EnumTest MON, } |
這段程式碼實際上呼叫了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[] for (EnumTest System.out.println(e.toString()); } System.out.println( "----------------我是分隔線------------------" ); EnumTest switch (test) case MON: System.out.println( "今天是星期一" ); break ; case TUE: System.out.println( "今天是星期二" ); break ; // default : System.out.println(test); break ; } } } |
輸出結果:
MON TUE WED THU FRI SAT SUN ----------------我是分隔線------------------ 今天是星期二 |
enum 物件的常用方法介紹
int
compareTo(E o)
比較此列舉與指定物件的順序。
Class<E>
getDeclaringClass()
返回與此列舉常量的列舉型別相對應的 Class 物件。
String
name()
返回此列舉常量的名稱,在其列舉宣告中對其進行宣告。
int
ordinal()
返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零)。
String
toString()
返回列舉常量的名稱,它包含在宣告中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回帶指定名稱的指定列舉型別的列舉常量。
public class Test public static void main(String[] EnumTest //compareTo(E switch (test.compareTo(EnumTest.MON)) case - 1 : System.out.println( "TUE ); break ; case 1 : System.out.println( "TUE ); break ; default : System.out.println( "TUE ); break ; } //getDeclaringClass() System.out.println( "getDeclaringClass(): + //name() System.out.println( "name(): + System.out.println( "toString(): + //ordinal(), System.out.println( "ordinal(): + } } |
輸出結果:
TUE getDeclaringClass(): name(): toString(): ordinal(): |
給 enum 自定義屬性和方法
給 enum 物件加一下 value 的屬性和 getValue() 的方法:
package com.hmw.test; /** * * * */ public enum EnumTest MON( 1 ), 2 ), 3 ), 4 ), 5 ), 6 ) @Override public boolean isRest() return true ; } }, SUN( 0 ) @Override public boolean isRest() return true ; } }; private int value; private EnumTest( int value) this .value } public int getValue() return value; } public boolean isRest() return false ; } } |
public class Test public static void main(String[] System.out.println( "EnumTest.FRI + } } |
輸出結果:
EnumTest.FRI |
EnumSet,EnumMap 的應用
public class Test public static void main(String[] // EnumSet<EnumTest> class ); for (EnumTest System.out.println(day); } // EnumMap<EnumTest, new EnumMap(EnumTest. class ); weekMap.put(EnumTest.MON, "星期一" ); weekMap.put(EnumTest.TUE, "星期二" ); // for (Iterator<Entry<EnumTest, Entry<EnumTest, System.out.println(entry.getKey().name() ":" + } } } |
原理分析
enum 的語法結構儘管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class檔案。該class檔案經過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum<E>。EnumTest 經過反編譯(javap com.hmw.test.EnumTest 命令)之後得到的內容如下:
public class com.hmw.test.EnumTest extends java.lang.Enum{ public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest public static final com.hmw.test.EnumTest static {}; public int getValue(); public boolean isRest(); public static com.hmw.test.EnumTest[] public static com.hmw.test.EnumTest com.hmw.test.EnumTest(java.lang.String, int , int , } |
所以,實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。
總結
可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(java是單一繼承)。
轉載地址:http://www.cnblogs.com/hyl8218/p/5088287.html
写评论
很抱歉,必須登入網站才能發佈留言。