枚举(enum)类型
關(guān)鍵字enum 可以將一組具名的值的有限集合創(chuàng)建一種新的類型,而這些具名的值可以作為常規(guī)的程序使用。創(chuàng)建enum 時(shí),編譯器會(huì)為你生成一個(gè)相關(guān)的類,這個(gè)類繼承自java.lang.Enum 。下面是一個(gè)例子演示了一些Enum 提供的一些功能。
package com.jas.enumtest;enum Animal{CAT,DOG,SHEEP}public class EnumClass {public static void main(String[] args) {for(Animal animal : Animal.values()){System.out.println(animal + " oridinal:" + animal.ordinal());System.out.print(animal.compareTo(Animal.DOG) + " ");System.out.print(animal.equals(Animal.DOG) + " ");System.out.println(animal == Animal.DOG);System.out.println(animal.getDeclaringClass());System.out.println(animal.name());System.out.println("--------分割線----------");}for(String str : "DOG,CAT,SHEEP".split(",")){Animal animal = Animal.valueOf(Animal.class,str);System.out.print(animal + " ");}} }輸出:
CAT oridinal:0
-1 false false
class com.jas.enumtest.Animal
CAT
——–分割線———-
DOG oridinal:1
0 true true
class com.jas.enumtest.Animal
DOG
——–分割線———-
SHEEP oridinal:2
1 false false
class com.jas.enumtest.Animal
SHEEP
——–分割線———-
DOG CAT SHEEP
??????ordinal() 方法返回一個(gè)int 類型的值,這個(gè)值是enum 在實(shí)例中聲明的順序,從0 開(kāi)始。可以使用 == 來(lái)比較enum 實(shí)例,編譯器會(huì)自動(dòng)為你提供equals() 方法與 hashCode() 方法。Enum 類實(shí)現(xiàn)了Comparable 接口,所以你可以使用compareTo() 方法。同時(shí)Enum 類還實(shí)現(xiàn)了Serializable 接口。
??????getDeclaringClass() 方法返回其所屬的類。
??????name 方法返回enum 實(shí)例聲明時(shí)的名字,這與toString 方法返回的值相同。valueOf() 是在Enum 中定義的static 方法,它可以根據(jù)給定的名字返回相應(yīng)的enum 實(shí)例,如果不存在給定名字的實(shí)例,就會(huì)拋出異常。
覆蓋enum 的方法:
??????當(dāng)我們想要覆蓋enum 中的方法時(shí),我們會(huì)發(fā)現(xiàn),它就只有一個(gè)方法toString(),當(dāng)我們覆蓋它時(shí)與覆蓋一般的類的方法沒(méi)有區(qū)別。
輸出
Cat Dog Sheep
向enum 中添加方法:
??????除了不能繼承一個(gè)enum 之外,我們基本上可以將enum 看作是一個(gè)常規(guī)的類。這也意味著enum 擁有自己的構(gòu)造函數(shù),以及我們可以向enum 中添加方法。它甚至是可以擁有main() 方法。這里我們通過(guò)一個(gè)方法返回一個(gè)枚舉類型的描述不再僅僅是一個(gè)toString() 類型的實(shí)現(xiàn)。
輸出:
CAT : 喵喵喵~
DOG : 汪汪汪~(yú)
SHEEP : 咩咩咩~
??????需要注意的是:如果我們打算自定義方法,那么必須在enum 徐磊實(shí)例的后面添加一個(gè)分號(hào)。同時(shí)Java 要求你必須先定義enum 實(shí)例,就像上面這樣我們打算在定義enum 實(shí)例之前定義description 但是卻得到一個(gè)編譯器的錯(cuò)誤提示。enum 中的構(gòu)造函數(shù)與方法與普通的類沒(méi)有任何區(qū)別,除了有少量的限制enum 可以說(shuō)就是一個(gè)類。所以我們可以使用enum 做許多額外的事。
switch 語(yǔ)句中的 enum:
??????一般來(lái)說(shuō),在switch 語(yǔ)句中 只能使用整數(shù)值,而枚舉天生就具備整數(shù)值的次序,并且可以通過(guò)ordinal() 方法獲得其在enum 中的順序,因此我們可以在switch 中使用枚舉。
輸出:
The traffic light is : RED
The traffic light is : GREEN
The traffic light is : YELLOW
The traffic light is : RED
values() 的神秘之處:
??????我們知道編譯器為我們創(chuàng)建的enum 都繼承自Enum 類。但是如果你去查看Enum 類就會(huì)發(fā)現(xiàn),它并沒(méi)有values() 方法。但是我們?cè)谏厦娲_實(shí)使用了這個(gè)方法,這是為什么呢?下面我們使用反射機(jī)制來(lái)查看其中的原因。
—– Analyzing class com.jas.enumtest.Explore —–
superClass : class java.lang.Enum
—– end —–
—– Analyzing class java.lang.Enum —–
genericInterface : java.lang.Comparable
genericInterface : interface java.io.Serializable
superClass : class java.lang.Object
—– end —–
exploreMethods : [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait]
enumMethods : [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait]
exploreMethods.containsAll(enumMethods): true
exploreMethods.removeAll(enumMethods): true
exploreMethods : [values]
??????答案就是values() 方法是由編譯器添加的static 方法。其實(shí)這個(gè)過(guò)程中還未其添加了valueOf() 方法。但是Enum 中明明已經(jīng)有了valueOf() 方法,為什么編譯器還會(huì)為其添加這個(gè)方法呢?Enum 中的valueOf() 方法需要傳遞進(jìn)來(lái)兩個(gè)參數(shù),但是新增的這個(gè)方法只需要傳遞進(jìn)來(lái)一個(gè)參數(shù)。
????????????????????????????????????????????????????????????????????????????????????????????????????????????參考書(shū)籍:
????????????????????????????????????????????????????????????????????????????????????????????????????????????????《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯
總結(jié)
以上是生活随笔為你收集整理的枚举(enum)类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 唐山城南经济开发区偏不偏(唐山城南经济开
- 下一篇: 比较String、StringBuffe