java enum是jdk1.5引入的 豺谈,在java.lang包中蔚携。Java Enum類型的語法結(jié)構(gòu)盡管和java類的語法不一樣嚼贡,應(yīng)該說差別比較大占贫。但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個class文件鬓催。該class文件經(jīng)過反編譯可以看到實際上是生成了一個類肺素,該類繼承了java.lang.Enum<E>。
使用
創(chuàng)建枚舉類型要是要enum關(guān)鍵字宇驾,是繼承java.lang.Enum抽象類的倍靡,所以枚舉類型不能繼承其他類了,但可以實現(xiàn)其他接口课舍。
枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 構(gòu)造函數(shù)中塌西,在這里他挎,每個值的名稱都被轉(zhuǎn)換成一個字符串,并且序數(shù)設(shè)置表示了此設(shè)置被創(chuàng)建的順序捡需。
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 Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
在枚舉類中定義屬性和方法
如果打算自定義自己的方法办桨,那么必須在enum實例序列的最后添加一個分號。
而且 要求必須先定義 enum 實例站辉。
public enum Color {
//這里相當(dāng)于Color RED=new Color("紅色", 1)呢撞;
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
使用接口組織枚舉
無法從enum繼承子類,如果需要擴(kuò)展enum中的元素饰剥,在一個接口的內(nèi)部殊霞,創(chuàng)建實現(xiàn)該接口的枚舉,以此將元素進(jìn)行分組捐川。達(dá)到將枚舉元素進(jìn)行分組的目的脓鹃。
public interface Food {
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
}
enum Dessert implements Food {
FRUIT, CAKE, GELATO
}
}
for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {
System.out.print(dessertEnum + " ");
}
enumMap
java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重復(fù);EnumMap中的 key是enum類型古沥,而value則可以是任意類型瘸右。
Map接口的實現(xiàn)類,其key-value映射中的key是Enum類型岩齿;
其原理就是一個對象數(shù)組太颤,數(shù)組的下標(biāo)索引就是根據(jù)Map中的key直接獲取,即枚舉中的ordinal值盹沈;
效率比HashMap高龄章,可以直接獲取數(shù)組下標(biāo)索引并訪問到元素;
enum Operate{
ADD, UPDATE, DELETE;
}
public class Main {
public static void main(String[] args) {
Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);
//put方法
map.put(Operate.ADD, "add operate");
map.put(Operate.UPDATE, "update operate");
map.put(Operate.DELETE, "delete operate");
//重寫了toString方法
System.out.println(map);
//size方法
System.out.println(map.size());
System.out.println(map.containsKey(Operate.UPDATE));
System.out.println(map.containsValue("update operate"));
System.out.println(map.get(Operate.DELETE));
//remove
map.remove(Operate.UPDATE);
System.out.println(map);
//key集合
for(Operate operate:map.keySet()){
System.out.print(operate + " ");
}
System.out.println();
//value集合
for(String obj:map.values()){
System.out.print(obj + ",");
}
System.out.println();
//key-value集合
for(Entry<Operate, String> entry:map.entrySet()){
System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
}
}
}
輸出:
{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
3
true
true
delete operate
{ADD=add operate, DELETE=delete operate}
ADD DELETE
add operate,delete operate,
ADD: add operate, DELETE: delete operate,
枚舉的用法
(1) 常用于對同一類常量進(jìn)行分類乞封。如color做裙、weekday
(2) 聲明接口方法時,輸入?yún)?shù)類型采用枚舉比用原始類型值常量更嚴(yán)謹(jǐn).
(3) 常量有時往往不僅僅只是一個值,有可能會包含多個屬性,此時很適合用枚舉
(4) 有時常量對象需要從配置文件中讀取其描述信息或者UI顯示信息,此時也適合用枚舉
(5)
注意:
- 枚舉類型對象之間的值比較,是可以使用==肃晚,直接來比較值锚贱,是否相等的。因為在Enum類里面关串,已經(jīng)重寫了equals方法拧廊,而方法里面比較就是直接使用==。
- 聲明枚舉屬性時最好用public final修飾,使用起來會非常方便 晋修。
- values()方法是編譯器插入到enum定義中的static方法吧碾,所以,當(dāng)你將enum實例向上轉(zhuǎn)型為父類Enum時墓卦,values()就不可訪問了倦春。解決辦法:在Class中有一個getEnumConstants()方法,所以即便Enum接口中沒有values()方法,我們?nèi)匀豢梢酝ㄟ^Class對象取得所有的enum實例溅漾。