爲什麼要用枚舉:
枚舉就是要讓某個類型的變量的取值只能在若干個固定的值中的一個,否則,編譯器會自動報錯。枚舉可以讓編譯器在編譯的時候就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。
枚舉幾要素:
1、關鍵詞
Java中枚舉類型的關鍵詞爲enum與其他語言一樣。凡是有關鍵字enum修辭定義的類型均是枚舉類型。如:public enum TestEnum{test1,test2;}
2、級別
枚舉類型的級別屬於對象級別。它與類、接口是同一級別的,與類和接口的定義一樣。所以枚舉類型是一個總稱,需要通過關鍵字enum去定義。且每定義一個枚舉類型都會自動繼承Java.lang.Enum。
3、實例
枚舉類型不能外部實例。故所有枚舉構造函數都是私有的或保護類型的。枚舉類型的雙重實例,第一重爲系統實例,二重實例爲代碼內實例。系統實例是根據枚舉量的數量自動實例對象並依次分配給枚舉量的。代碼內實例與類實例一樣。
4、枚舉量
前面講了枚舉量是枚舉類型的一個實例,故每個枚舉量都擁有其父類及其本枚舉定義的字段和方法。
4.1枚舉量的聲明
枚舉量的聲明必須位於枚舉定義體的開頭。聲明的方式爲,枚舉名加枚舉構造參數。如枚舉無構造參數的可省略爲只用其名聲明。如public enum Test{
test1(12),test2(23);
private Test(int i){}
}
5、枚舉實用方法
Enum 重寫了toString()方法,在定義枚舉類型時如果不重寫父類的toString(),則每個枚舉變量得toString()將輸出枚舉變量名。
values(),返回所有枚舉量。
ordinal(),返回枚舉量的序號。
valueOf(),將String轉換成枚舉。
6、用途
枚舉的出現是爲了方便定義和使用一些常量字段。試圖通過一個變量的方式引用所有字段,這既便於傳遞和全局化,也實現了集中管理。但,由於面向對象的編程語言的出現,使實現類似的功能變得非常簡單,所以在面向對象的編程中,枚舉的意義並沒有在其在過程語言中那麼重要。從枚舉出現的意義上看,在面向對象的編程語言中,其用途不大,唯一的用途就是可以簡化編程。
7、替代
使用具有常量字段的私有類可替換枚舉類型。但要有批處理和模糊處理功能
瞭解了這些基本特性,我們來看看如何使用它們。
7個常用的用法:
用法一:常量
在JDK1.5之前,我們定義常量都是:publicstaticfianl....。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型裏,而且枚舉提供了比常量更多的方法。
- public enum Color {
- RED, GREEN, BLANK, YELLOW
- }
用法二:switch
JDK1.6之前的switch語句只支持int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強。
- 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實例序列的最後添加一個分號。而且Java要求必須先定義enum實例。
- public enum Color {
- RED("紅色", 1), GREEN("綠色",2), BLANK("白色",3), YELLO("黃色",4);
- // 成員變量
- private String name;
- private int index;
- // 構造方法
- 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;
- }
- }
用法四:覆蓋枚舉的方法
下面給出一個toString()方法覆蓋的例子。
- public enum Color {
- RED("紅色", 1), GREEN("綠色",2), BLANK("白色",3), YELLO("黃色",4);
- // 成員變量
- private String name;
- private int index;
- // 構造方法
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
- //覆蓋方法
- @Override
- public String toString() {
- return this.index+"_"+this.name;
- }
- }
用法五:實現接口
所有的枚舉都繼承自java.lang.Enum類。由於Java不支持多繼承,所以枚舉對象不能再繼承其他類。
- public interface Behaviour {
- void print();
- String getInfo();
- }
- public enum Colorimplements Behaviour{
- RED("紅色", 1), GREEN("綠色",2), BLANK("白色",3), YELLO("黃色",4);
- // 成員變量
- private String name;
- private int index;
- // 構造方法
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
- //接口方法
- @Override
- public String getInfo() {
- return this.name;
- }
- //接口方法
- @Override
- public void print() {
- System.out.println(this.index+":"+this.name);
- }
- }
用法六:使用接口組織枚舉
- public interface Food {
- enum Coffee implements Food{
- BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
- }
- enum Dessert implements Food{
- FRUIT, CAKE, GELATO
- }
- }
用法七:關於枚舉集合的使用
java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重複;EnumMap中的key是enum類型,而value則可以是任意類型。
還有一種比較複雜的枚舉(帶上抽象方法):
public enum TrafficLamp{
RED{
public TrafficLamp nextLamp(){
return Green;
}
},
Green{
public TrafficLamp nextLamp(){
return Yellow;
}
},
Yellow{
public TrafficLamp nextLamp(){
return RED;
}
},
public abstract TrafficLamp nextLamp();//abstract方法
}
其中每個枚舉對象都是一個子類。