Sealed Class 的主要用途

1. 限制类层次结构

Sealed class 允许你定义一个受限的类层次结构,所有子类必须在同一个文件或模块中声明。这使得编译器能够知道所有可能的子类型,从而提供更好的类型安全性。

2. 增强模式匹配

在使用 when 表达式或模式匹配时,编译器可以验证是否覆盖了所有可能的子类。如果遗漏了某个分支,编译器会发出警告,这有助于避免运行时错误。

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

fun handleResult(result: Result) = when(result) {
    is Result.Success -> println(result.data)
    is Result.Error -> println(result.message)
    is Result.Loading -> println("Loading...")
    // 不需要 else 分支,因为编译器知道所有可能的情况
}

3. 表示有限状态

Sealed class 非常适合表示具有有限数量状态的场景,例如:

4. 替代枚举类的高级用法

与枚举类相比,sealed class 的每个子类可以有不同的属性和方法,提供更大的灵活性。每个子类可以是:

5. 提高代码可维护性

通过将所有可能的子类型集中在一个地方,sealed class 使代码更易于理解和维护。当需要添加新的子类型时,编译器会帮助你找到所有需要更新的地方。

6. 类型安全的 API 设计