列舉

列舉 在 Java

12 個練習

關於 列舉

_列舉型別_是一種特殊的資料型態,能讓變數成為一組預先定義的常數。 變數必須等於為其預先定義的其中一個值。 常見的例子包括羅盤方位(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
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 列舉