_列舉型別_是一種特殊的資料型態,能讓變數成為一組預先定義的常數。
變數必須等於為其預先定義的其中一個值。
常見的例子包括羅盤方位(NORTH、SOUTH、EAST和WEST等值)以及一週中的日子。
因為它們是常數,所以列舉型別的欄位名稱會使用大寫字母。
在 Java 程式語言中,你可以使用enum關鍵字來定義列舉型別。
例如,你可以這樣指定一週中每天的列舉型別:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
當你需要表示一組固定的常數時,就應該使用列舉型別。 這包括自然存在的列舉型別,例如太陽系中的行星,以及在編譯時期就知道所有可能值的資料集,例如選單上的選項、命令列旗標等等。
以下程式碼示範如何使用上面定義的DayOfWeek列舉:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Java 程式語言的列舉型別比其他語言中的對應功能強大得多。
enum宣告會定義一個_類別_(稱為_列舉型別_)。
列舉類別的主體可以包含方法和其他欄位:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
在Rating列舉型別的成員上呼叫getNumberOfStars方法:
Rating.GOOD.getNumberOfStars();
// => 4
編譯器在建立列舉時會自動新增一些特殊方法。
例如,它們有一個靜態的values方法,會回傳一個陣列,其中包含列舉的所有值,並依照宣告的順序排列:
for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
System.out.println(dayOfWeek.toString());
}
上面的程式片段會印出以下內容:
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
編譯器也會新增一個靜態的valueOf方法,會根據名稱回傳列舉成員:
DayOfWeek.valueOf("SUNDAY");
// => DayOfWeek.SUNDAY