Sealed class 允许你定义一个受限的类层次结构,所有子类必须在同一个文件或模块中声明。这使得编译器能够知道所有可能的子类型,从而提供更好的类型安全性。
在使用 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 分支,因为编译器知道所有可能的情况
}
Sealed class 非常适合表示具有有限数量状态的场景,例如:
与枚举类相比,sealed class 的每个子类可以有不同的属性和方法,提供更大的灵活性。每个子类可以是:
通过将所有可能的子类型集中在一个地方,sealed class 使代码更易于理解和维护。当需要添加新的子类型时,编译器会帮助你找到所有需要更新的地方。