【Kotlin 入門指南】密封類別(sealed class)

更新於 發佈於 閱讀時間約 5 分鐘
【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

密封類別

當物件有限定狀態時,我們常使用「列舉列別(enum class)」。不過,它較適合用來判斷簡單的狀態,不容許變數傳遞。當需要傳遞變數運算時,我們會採用「密封類別(sealed class)」,它可視為 enum class 的進階版。

密封類允許我們建立一個有限的類別階層結構。這些類別必須被定義在同一個檔案中,這樣做是為了確保封閉性。密封類別的主要特性在於其所有的子類別必須在同一個檔案中定義,這樣做有助於更有效地控制類別繼承結構。

要定義一個密封類別,我們需要使用 sealed 關鍵字來修飾類別聲明,然後在該類別內部定義其允許的子類別。這些子類別必須直接繼承自密封類別,並且可以在同一個檔案內或相同的封閉作用域中。

密封類別範例

sealed class MySealedClass {
//密封類的成員,必須繼承自己類別 MySealedClass()
//如果沒有參數應為 object 類型
object State1 : MySealedClass()
object State2 : MySealedClass()
object State3 : MySealedClass()

//有參數可為 class 或 data class 類型
class State4(val value: Int) : MySealedClass()
}

class MyClass(private val data: MySealedClass) {
fun show() =
when (data) {
is MySealedClass.State1 -> "State1"
is MySealedClass.State2 -> "State2"
is MySealedClass.State3 -> "State3"
is MySealedClass.State4 -> "State4: ${data.value}"

//若少實現一種 MySealedClass 狀態條件判斷會噴錯,除非加入 else 判斷。
// else -> "未知狀態"
}
}

fun main() {
println(MyClass(MySealedClass.State1).show())
println(MyClass(MySealedClass.State4(100)).show())
}

在這個範例中,我們定義一個名為 MySealedClass 的密封類別,密封類的成員可以是 object 類型,像是 State1State2State3,它們不需要任何參數,代表這些狀態的存在即可。

密封類的成員也可以是帶有參數的類型,像是 State4,它是一個含有整數參數 value 的類型。這些帶參數的類型可以是一般的 class 或是 data class 類型。

接下來,在 MyClass 這個類別中,有一個接收 MySealedClass 作為參數的函式 show()。這個函式利用 when 表達式對傳入的 MySealedClass 密封類型進行模式匹配。根據不同的狀態,返回相對應的字串表示狀態。

需要特別注意的是,若沒有涵蓋到所有的密封類型,即缺少了對某個狀態的判斷,Kotlin 將會提示錯誤。為了避免這種情況,你可以加上 else 分支來處理未知的狀態,像是 else -> "未知狀態",這樣能確保所有情況都被考慮到。

最後,在 main() 函式中,展示了如何創建 MyClass 的實例並呼叫 show() 函式,透過不同的 MySealedClass 狀態輸出對應的結果。

這種模式匹配的方式能讓程式碼更為清晰,並且在處理有限類型集合時提供了更好的可擴展性和安全性。

留言
avatar-img
留言分享你的想法!
avatar-img
HKT實驗室
24會員
261內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
HKT實驗室的其他內容
2023/12/15
本文介紹 Kotlin 中的延遲初始化(lateinit)和懶加載(lazy)的使用方法,以及它們之間的差異。這些關鍵字能夠提升程式效能並簡化程式碼撰寫。
Thumbnail
2023/12/15
本文介紹 Kotlin 中的延遲初始化(lateinit)和懶加載(lazy)的使用方法,以及它們之間的差異。這些關鍵字能夠提升程式效能並簡化程式碼撰寫。
Thumbnail
2023/12/11
空值例外是開發中一個常見的風險,特別是在 Kotlin 和 Java 這樣的跨平台開發中更容易出現。藉由合理地運用 Kotlin 的空值安全機制以及對 Java 程式碼的註解,可以有效地降低程式錯誤的風險,提高程式碼的可靠性和穩定性。
Thumbnail
2023/12/11
空值例外是開發中一個常見的風險,特別是在 Kotlin 和 Java 這樣的跨平台開發中更容易出現。藉由合理地運用 Kotlin 的空值安全機制以及對 Java 程式碼的註解,可以有效地降低程式錯誤的風險,提高程式碼的可靠性和穩定性。
Thumbnail
2023/12/11
在 IntelliJ IDEA 建立 Kotlin 專案時,要執行 Java 程式只需將其檔案命名為 .java,並放置在專案的 java 目錄中。這樣就可以順利執行該 Java 程式。
Thumbnail
2023/12/11
在 IntelliJ IDEA 建立 Kotlin 專案時,要執行 Java 程式只需將其檔案命名為 .java,並放置在專案的 java 目錄中。這樣就可以順利執行該 Java 程式。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
當你在 Kotlin 中使用 val 或 var 定義一個屬性時,在 Java 中預設會轉換為 getter 和 setter 方法。如果你希望直接在 Java 中存取這個屬性,可以使用 @JvmField 註解。這會讓 Kotlin 編譯器將屬性生成為公開的,而非生成 getter 和 sette
Thumbnail
當你在 Kotlin 中使用 val 或 var 定義一個屬性時,在 Java 中預設會轉換為 getter 和 setter 方法。如果你希望直接在 Java 中存取這個屬性,可以使用 @JvmField 註解。這會讓 Kotlin 編譯器將屬性生成為公開的,而非生成 getter 和 sette
Thumbnail
let 區域函數是 Kotlin 中一個非常實用的工具,特別適用於處理可空對象。它讓程式碼更加簡潔、安全,同時提高了可讀性。透過 let 區域函數,我們可以更優雅地處理可空性問題,使得程式開發更加高效順暢。
Thumbnail
let 區域函數是 Kotlin 中一個非常實用的工具,特別適用於處理可空對象。它讓程式碼更加簡潔、安全,同時提高了可讀性。透過 let 區域函數,我們可以更優雅地處理可空性問題,使得程式開發更加高效順暢。
Thumbnail
當物件有限定狀態時,我們常使用「列舉列別(enum class)」。不過,它較適合用來判斷簡單的狀態,不容許變數傳遞。當需要傳遞變數運算時,我們會採用「密封類別(sealed class)」,它可視為 enum class 的進階版。
Thumbnail
當物件有限定狀態時,我們常使用「列舉列別(enum class)」。不過,它較適合用來判斷簡單的狀態,不容許變數傳遞。當需要傳遞變數運算時,我們會採用「密封類別(sealed class)」,它可視為 enum class 的進階版。
Thumbnail
在 Kotlin 程式語言中,資料類別 (Data classes) ,它讓你能夠輕鬆地建立和定義只用來儲存資料的類別,讓程式碼更簡潔、更容易閱讀。資料類別的主要目的是暫時保存資料,而不是處理邏輯行為。
Thumbnail
在 Kotlin 程式語言中,資料類別 (Data classes) ,它讓你能夠輕鬆地建立和定義只用來儲存資料的類別,讓程式碼更簡潔、更容易閱讀。資料類別的主要目的是暫時保存資料,而不是處理邏輯行為。
Thumbnail
當今天某個類別,比如說 String,在不能直接修改其程式碼或無法繼承使用的情況下,你可以運用 Kotlin 的擴展功能,來擴展該類別的功能。它允許你擴展現有的類別,而不需修改其原始碼。這使得你能夠向任何類別添加新的功能,讓程式碼更具靈活性。
Thumbnail
當今天某個類別,比如說 String,在不能直接修改其程式碼或無法繼承使用的情況下,你可以運用 Kotlin 的擴展功能,來擴展該類別的功能。它允許你擴展現有的類別,而不需修改其原始碼。這使得你能夠向任何類別添加新的功能,讓程式碼更具靈活性。
Thumbnail
本指南介紹了 Kotlin 中類別的主構造函數和次要構造函數的使用方法,並提供了相應的程式碼範例和初始化順序說明。
Thumbnail
本指南介紹了 Kotlin 中類別的主構造函數和次要構造函數的使用方法,並提供了相應的程式碼範例和初始化順序說明。
Thumbnail
List 集合特性:按照順序排列,可以放重覆的物件
Thumbnail
List 集合特性:按照順序排列,可以放重覆的物件
Thumbnail
Kotlin 的字串資料類型代表文字的資料型別,使用雙引號括起來。此外,Kotlin 還支援字串模板,讓在字串中插入變數和表達式更加容易。 除此之外,Kotlin 還提供了許多內建的字串函數,像是 substring() 和 replace(),幫助更輕鬆地處理和操作字串。
Thumbnail
Kotlin 的字串資料類型代表文字的資料型別,使用雙引號括起來。此外,Kotlin 還支援字串模板,讓在字串中插入變數和表達式更加容易。 除此之外,Kotlin 還提供了許多內建的字串函數,像是 substring() 和 replace(),幫助更輕鬆地處理和操作字串。
Thumbnail
使用者自訂的資料型別
Thumbnail
使用者自訂的資料型別
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News