有時,變數的取值只在一個有限的集合內。針對這種情況,可以使用枚舉類型。此外,使用枚舉值來代替直接使用字面量可以讓程式更加易於閱讀和維護。本文將從枚舉類型的定義以及如何使用枚舉類型兩個方面對枚舉類型進行詳細的介紹。 ...
枚舉類型定義了一個枚舉值的列表,每個值是一個標識符。例如,下麵的語句聲明瞭一個枚舉類型,用來表示星期的可能情況:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
實際上,這個聲明定義的類型是一個類,它有7個實例。因此,在比較兩個枚舉類型的值時,永遠不需要調用equals,直接使用“==”就可以了。
枚舉類型的值類似於一個常量,因此,按照慣例拼寫都使用大寫字母。而枚舉類型的命名則與類名的命名規則一致。
一旦定義了枚舉類型,就可以使用這個類型來聲明變數:
Day day;
變數day只能是枚舉類型Day中的一個值或null。可以使用下麵的語法訪問枚舉值:
EnumName.ValueName
例如,下麵的語句將枚舉值賦給變數day:
day = Day.SUNDAY;
可以在一個枚舉類型的對象上使用下麵的方法:
- public String name();
返回枚舉值的名字。
- public int ordinal();
返回枚舉值的序號。枚舉類型中的第一個值序號為0,第二個值序號為1,依次類推。
下麵的例子展示了枚舉類型的使用:
public class EnumDemo {
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public static void main(String[] args) {
Day day1 = Day.FRIDAY;
Day day2 = Day.THURSDAY;
System.out.println("The name of day1 is" + day1.name());
System.out.println("The name of day2 is" + day2.name());
System.out.println("The ordinal of day1 is" + day1.ordinal());
System.out.println("The ordinal of day2 is" + day2.ordinal());
}
}
這個程式的輸出如下:
The name of day1 is FRIDAY
The name of day2 is THURSDAY
The ordinal of day1 is 5
The ordinal of day2 is 4
由於枚舉類型是Object類的子類和Comparable介面的實現類,因此可以對枚舉對象調用Object類的方法,例如equals,toString等,也可以調用Comparable介面的compareTo方法。
在switch-case語句中使用枚舉類型時,case標簽可以是省略枚舉類型的枚舉值,例如:
switch (day) {
case SUNDAY:
// process SUNDAY
case MONDAY:
// process MONDAY
...
}
可以定義具有數據域、構造器和方法的枚舉類型:
public enum Day {
SUNDAY("星期天"), MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),
THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六");
public String description;
private Day(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
需要註意的是,當枚舉類型中除了枚舉值的聲明外還有其他部分時,枚舉值的聲明必須是第一條語句,且結尾處需要使用分號。此外,由於枚舉值的數量是在編譯期就確定的,因此不建議創建新的枚舉值,所以Java語法要求枚舉類型的構造方法是私有的以避免被直接調用。private修飾符可省略,這種情況下,構造方法也會被預設為私有的。