2023-12-08|閱讀時間 ‧ 約 6 分鐘

【Kotlin 入門指南】列舉類別 (Enum classes)

【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

列舉類別

在 Kotlin 程式語言中,列舉類別 (Enum classes) 可以定義一組具有固定名稱和值的常數。我們通常會使用列舉類別來表示一組相關的狀態或選項,例如:顏色(黃、綠、紅)、方向(東、南、西、北)、技能等級(高、中、低)。

基本列舉類別範例

enum class Color {
YELLOW,
GREEN,
RED
}

fun main() {
println("${Color.YELLOW.ordinal} : ${Color.YELLOW.name}")
}

輸出結果

0 : YELLOW

在這一個範例中,我們建立了一個名為Color的列舉類別,其中包含了YELLOWGREENRED三種不同的顏色。每個列舉成員都是Color類別的一個實例,而這些實例可以像常規類別一樣被引用。例如,你可以透過Color.YELLOW來存取YELLOW這個列舉成員。而其中ordinal屬性代表了該列舉成員在列舉類別中的索引位置,從0開始計算。name屬性則代表了該列舉成員的名稱。

main函數中,你使用了Color.YELLOW.ordinalColor.YELLOW.name來取得YELLOW這個列舉成員的索引位置和名稱。通過這段程式碼,你可以得到0 : YELLOW的輸出結果。

這樣的設計可以讓程式中更方便地使用預定義的命名常數,使得程式碼更易讀、易懂。列舉類別在許多情況下都是一個有用且方便的程式設計元素,特別是當你需要定義一個固定且有限的集合時。

列舉初始值

建立一個列舉(enum)時,可以為每個列舉實例指定一個初始值。這個初始值可以是任何 Kotlin 支援的類型,像是整數、字串等。

列舉初始值範例

enum class Level(val title: String) {
HIGH("高級"),
MIDDLE("中級"),
LOW("初級"),
}

fun main() {
println("${Level.HIGH.ordinal}, ${Level.HIGH.name}, ${Level.HIGH.title}")
}

在這個範例中,每個列舉實例(HIGH、MIDDLE、LOW)都有一個與之關聯的字串初始值,我們印出 Level.HIGH 等級的相關資訊,代表了該等級的說明。例如,HIGH 等級的初始值為 "高級",而 MIDDLE 等級的初始值為 "中級",以此類推。

透過Level.HIGH.ordinal 會回傳該列舉實例在列舉類別中的序數(從零開始計算)。而 Level.HIGH.name 則會取得該列舉實例的名稱,這裡會是 "HIGH"。最後,我們可以透過 Level.HIGH.title 取得這個等級的名稱,也就是 "高級"。

這種方式能讓你以清晰且易讀的方式管理固定集合的值,在需要時輕鬆地使用它們。

列舉類別函數

建立列舉(enum)時,可以為列舉類別定義函數。這些函數可以用來執行與列舉類別相關的操作,讓程式碼更有結構性且易於擴展。

列舉類別函數範例

data class LevelData(var title: String)

enum class Level(private var data: LevelData) {
HIGH(LevelData("高級")),
MIDDLE(LevelData("中級")),
LOW(LevelData("初級")),

; //列舉結束符號

fun show() = "${data.title}"

fun update(levelData: LevelData) {
println("更新前資料:${data.title}")

this.data.title = levelData.title

println("更新後資料:${data.title}")
}
}

fun main() {
println(Level.LOW)

println(Level.LOW.show())

Level.LOW.update(LevelData("入門"))
}

在這個範例中,我們建立一個 LevelData 的資料類別(data class),這個類別只有一個名為 title 的可變字串屬性。

接著,我們建立了一個名為 Level 的列舉類別(enum class),裡面包含了三個列舉實例:HIGH、MIDDLE 和 LOW。每個列舉實例都帶有一個對應的 LevelData 物件,代表不同等級的標題。

列舉實例包含了兩個函數:show()update(levelData: LevelData)show() 函數返回該列舉實例對應的標題,而 update(levelData: LevelData) 函數用於更新列舉實例的標題資料。

接著在 main() 函數中,println(Level.LOW) 印出 LOW 列舉實例。println(Level.LOW.show()) 印出 LOW 列舉實例對應的標題。Level.LOW.update(LevelData("入門")) 更新 LOW 列舉實例的標題為 "入門"

使用列舉類別的好處

  • 程式碼更清晰:使用列舉類別可以使程式碼更易讀和維護。
  • 類型安全:列舉類別限制了可以使用的值,減少了錯誤。
  • 方便的方法和屬性:你可以在列舉類別中定義方法和屬性,使其更具功能性。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.