JDK 5出現的新特性,新增的enum關鍵字用於定義枚舉類。Java中聲明的枚舉類,均是繼承自Enum。
爲什麼需要枚舉?
Java的一些方法在運行時,它需要的數據不能是任意的,而必須是一定範圍內的值,此類問題在JDK5以前的程序猿們都採用自定義帶有枚舉功能的類解決,Java5新特性出現後可以直接使用枚舉予以解決。
枚舉類具有以下特性:
① 枚舉類是一種特殊形式的java類;
② 枚舉類中聲明的每一個枚舉值代表枚舉類的一個實例對象;
③ 與java中的普通類一樣,在聲明枚舉類時,也可以聲明屬性、方法和構造函數,但是構造函數必須是私有的。(爲避免還可以使用該方法的構造函數創建其他對象);
④ 枚舉類也可以實現接口或者繼承抽象類;
⑤ JDK 5 中擴展的switch語句,它除了可以接受int、short、byte、char外,還可以接受一個枚舉類型;
⑥ 若枚舉類只有一個枚舉值,則可以當作單態設計模式(內存始終只有一個該類的對象)使用;
自定義帶有枚舉功能的類示例代碼(例如學生成績五個等級):
class Grade{
private Grade(){} //Grade方法的構造函數,私有是爲了限制數據不能是任意的
public static final Grade A=new Grade();
public static final Grade B=new Grade();
public static final Grade C=new Grade();
public static final Grade D=new Grade();
public static final Grade E=new Grade();
}
一個枚舉也可以有構造函數、字段和方法。例如每週都有7天,分別爲MON、TUE、 WED、 THU、FRI、SAT、 SUN,我們在使用這種類型的數據時候,也可以使用枚舉。示例代碼:
enum WeekDay {
A("MON"), B("TUE"), C("WED"), D("THU"), E("FRI"), F("SAT"), G("SUN");
private String value;<span style="white-space:pre"> </span>//封裝每個對象對應的字段
private WeekDay(String wd) {
this.value = wd;
}
public String getValue() {
return this.value;
}
}
特別注意的是:定義枚舉類的時候構造函數必須要私有。
帶抽象方法的枚舉示例代碼:
enum WeekDay {
A("MON") {
public String localValue() {
return "週一";
}
},
B("TUE") {
public String localValue() {
return "週二";
}
},
C("WED") {
public String localValue() {
return "週三";
}
},
D("THU") {
public String localValue() {
return "週四";
}
},
E("FRI") {
public String localValue() {
return "週五";
}
},
F("SAT") {
public String localValue() {
return "週六";
}
},
G("SUN") {
public String localValue() {
return "週日";
}
};
private String value;
private WeekDay(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public abstract String localValue();
}
注意:在定義枚舉時,定義了抽象方法時,需要在創建每個枚舉對象時候實現該抽象方法;
由於枚舉類繼承自Enum,所以其繼承Enum的所有方法,枚舉類中的常用方法有:
name();返回次枚舉常量的名稱,在其枚舉聲明中對其進行聲明;
ordinal();返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量爲0);
valueof(class enumClass,String name);返回帶指定名稱的指定枚舉類型的枚舉常量;
values();用於遍歷枚舉的所有枚舉值。