甘肅省建設(shè)廳官方網(wǎng)站張睿長沙互聯(lián)網(wǎng)網(wǎng)站建設(shè)
枚舉(enum)
enum全稱enumeration,JDK 1.5中引入的新特性。在Java中,被enum關(guān)鍵字修飾的類型就是枚舉類型
可以將枚舉看成一個類,它繼承于java.lang.enum類,當定義一個枚舉類型時,每一個枚舉類型成員都可以看作是枚舉類型的一個實例,枚舉類型成員默認被public static final修飾(所有的枚舉值都是類靜態(tài)常量),所以當使用枚舉類型成員時直接使用枚舉類型名稱調(diào)用枚舉類型成員即可。
enum Color { RED, GREEN, BLUE }
如果枚舉不添加任何方法,枚舉值默認為從0開始的有序數(shù)值。以Color枚舉類型舉例,它的枚舉常量依次為RED:0,GREEN:1,BLUE:2。
枚舉的好處:可以將常量組織起來,統(tǒng)一進行管理
枚舉的典型應(yīng)用場景:錯誤碼、狀態(tài)機等
特性:除了不能繼承,基本上可以將enum看做一個常規(guī)的類
作用?
枚舉是一種規(guī)范,它規(guī)范了參數(shù)的形式,這樣就可以不用考慮類型的不匹配并且顯式的替代了int型參數(shù)可能帶來的模糊概念。枚舉像一個類,又像一個數(shù)組。
優(yōu)勢
(1)類型安全
(2)緊湊有效的數(shù)據(jù)定義
(3)可以和程序其他部分完美交互
(4)運行效率高
本質(zhì)
盡管enum看起來像是一種新的數(shù)據(jù)類型,事實上,enum是一種受限制的類,并且具有自己的方法。創(chuàng)建enum時,編譯器會生成一個相關(guān)的類,這個類繼承自java.lang.Enum
構(gòu)造方法
在枚舉類型中,可以添加構(gòu)造方法,但是規(guī)定這個構(gòu)造方法必須為private修飾符或者默認修飾符所修飾
public enum Color {RED(1, "紅色"), GREEN(2, "綠色"), RED_ONE(1);private int index;private String value;private Color() {// 無參構(gòu)造}private Color(int index) {this.index = index;}private Color(int index, String value) {// 有參構(gòu)造this.index = index;this.value = value;}
}
保存枚舉值,應(yīng)該是要保存int值,如果保存字符串,在使用中英文切換可能就會出問題
枚舉類型可以實現(xiàn)一個或多個接口,但是不能繼承類。因為編譯器會默認將枚舉類型繼承自java.lang.Enum類,這一過程由編譯器完成
枚舉類型中的常量成員必須在其他成員之前定義,否則這個枚舉類型不會產(chǎn)生對象
方法
方法 | 描述 |
---|---|
values() | 返回enum實例的數(shù)組。數(shù)組中的元素嚴格保持在enum中聲明時的順序 |
name() | 返回實例名 |
ordinal() | 返回實例聲明時的次序,從0開始 |
getDeclaringClass() | 返回實例所屬的enum類型 |
equals() | 判斷是否為同一個對象 |
可以使用==來比較enum實例。此外,java.lang.Enum實現(xiàn)了Comparable和 Serializable 接口,所以也提供 compareTo()方法 |
為枚舉顯示的賦值
Java不允許使用 = 為枚舉常量賦值
enum可以添加普通方法、靜態(tài)方法、抽象方法、構(gòu)造方法
Java雖然不能直接為實例賦值,但是它有更優(yōu)秀的解決方案:為enum添加方法來間接實現(xiàn)顯示賦值。創(chuàng)建enum時,可以為其添加多種方法,甚至可以為其添加構(gòu)造方法
注意:如果要為enum定義方法,那么必須在enum的最后一個實例尾部添加一個分號。此外,在enum中,必須先定義實例,不能將字段或方法定義在實例前面。否則,編譯器會報錯
常見用法
1.常量
枚舉可以把相關(guān)的常量分組到一個枚舉類型里,而且枚舉提供了比常量更多的方法
public enum Color { RED, GREEN, BLANK, YELLOW
}
2.Switch
JDK1.6之前的switch語句只支持int,char,enum類型,使用枚舉,能讓代碼可讀性更強
enum Color { GREEN, YELLOW, RED
} class TrafficLight { Color color = Color.RED; public void change() { switch (color) { case RED: color = Color.GREEN; break; case YELLOW: color = Color.RED; break; case GREEN: color = Color.YELLOW; break; } } }
3.向枚舉中添加新方法
public enum Color {RED(1, "紅色"), GREEN(2, "綠色"), BLANK(3, "白色"), YELLO(4, "黃色");// 成員變量private int index;private String name;private Color(int index, String name) {// 構(gòu)造方法this.name = name;this.index = index;}// 普通方法public static String getName(int index) { //定義了才能使用RED(1, "紅色")for (Color c : Color.values()) {if (c.getIndex() == index) {return c.name;}}return null;}// getter、setterpublic 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;}
}
4.覆蓋枚舉的方法
toString()方法覆蓋
public enum Color {RED(1, "紅色"), GREEN(2, "綠色"), BLANK(3, "白色"), YELLO(4, "黃色");// 成員變量private int index;private String name;private Color(int index, String name) {// 構(gòu)造方法this.name = name;this.index = index;}@Overridepublic String toString() {// 覆蓋toString方法return this.index + "_" + this.name;}
}
5.實現(xiàn)接口
所有的枚舉都繼承自java.lang.Enum類。由于Java不支持多繼承,所以枚舉對象不能再繼承其他類
interface Behaviour {void print();String getInfo();
}public enum Color implements Behaviour {RED(1, "紅色"), GREEN(2, "綠色"), BLANK(3, "白色"), YELLO(4, "黃色");// 成員變量private int index;private String name;private Color(int index, String name) {// 構(gòu)造方法this.name = name;this.index = index;}@Overridepublic String getInfo() {//接口方法 return this.name;}@Overridepublic void print() {// 接口方法System.out.println(this.index + ":" + this.name);}
}
6.使用接口組織枚舉
public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO }
}
7.枚舉集合
java.util.EnumSet和java.util.EnumMap是兩個枚舉集合
EnumSet保證集合中的元素不重復(fù);EnumMap中的 key是enum類型,而value則可以是任意類型
枚舉遍歷
for (RnumTest e : RnumTest.values()) {System.out.println(e.toString());
}