一個簡單的例子:
枚舉定義類:
測試類:
關鍵詞:實例,常量
枚舉也是一個類。從測試類的第5行知,枚舉變量的聲明與一般對象類的聲明是相同的(Spiciness howHot = ...)。
枚舉定義類的第4行:NOT,MILD...,每一串字母都是一個實例,每一個實例都是常量。即:Spiciness這個枚舉類在聲明時與一般聲明相同:Spiciness howHot=...,而等號後面的具體實例只能有五個值:Spiciness.NOT,Spiciness.MILD等等。
常量也有自己的方法
ordinal():某個enum實例在所有實例中的位置。(比如上例:Spiciness.MEDIUM.ordinal() == 2)。
注意,這裡ordinal()是實例對象調用的。
values():靜態方法,按照所有常量在枚舉中的位置,返回所有常量構成的數組:
注意,values()是靜態方法,直接用Spiciness調用。
關鍵詞:java.lang.Enum
你創建enum時,編譯器會為這個enum生成一個枚舉類,這個類繼承自:java.lang.Enum。
編譯器會為這個枚舉類自動加上toString()、hashCode()等方法,所以,在不同的枚舉常量之間,可以用equals、==去比較引用、比較值等:(注意equals與==的區別,equals與hashCode的關系)
Enum類實現了Comparable接口,所以,枚舉之間可以用compareTo方法比較。
像一般類一樣對待enum
看上面的代碼,除了一些特殊的限制之外,enum也是一個類,它繼承自Enum類,那麼,我們就可以按照操作一般類的方式去操作enum。
比如,第13行,加了一個私有構造器(私有構造器使得我們不能從類的外部使用new的方式創建一個實例,但對於枚舉類,即使你在這裡寫一個public,我們也不能從外部創建實例,還是要從內部創建)。
第11、17行等,都是像一般類一樣定義變量、方法。
而由於WEST、NORTH等本身就是enum內部創建的實例,那麼由於你定義的構造函數中有參數,就要給WEST、NORTH等實例常量後面加上參數(類似於一般類創建實例的方式)。
不過這裡有一個限制,在定義方法之前,必須首先定義enum實例,即:5、6、7、8、9行必須寫在前面。
關鍵詞:switch
枚舉本來就是常量,用在switch中再合適不過,用法也比較簡單,舉例略。
關鍵詞:values()
前面說過,values()方法是一個靜態方法,但更有趣的是,enum的父類Enum類是沒有這個方法的,values()方法是enum在編譯時,編譯器加上的。
既然父類Enum沒有values()方法,那如果把enum類“向上轉型”為Enum類型,就訪問不到values()方法了:
但是天無絕人之路,你如果真想獲取實例常量數組的話,還是有辦法的。通過反射獲取enum的Class,你會發現,Class正好有個getEnumConstants()可以滿足你的需求:
更多內容請關注微信訂閱號:it_pupil