一、密封类核心概念
核心特性:
受限继承:子类必须在同一文件或嵌套类中定义
封闭性:编译器知道所有可能的子类型
抽象性:不能直接实例化,类似抽象类
二、基础语法与使用
1. 基本定义
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()
}
2. 模式匹配(when表达式)
fun handleResult(result: Result<String>) {
when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Error: ${result.exception}")
Result.Loading -> println("Loading...")
// 不需要else分支!编译器确保全覆盖
}
}
三、应用场景
1. 状态机管理(UI状态)
sealed class LoginState {
object Idle : LoginState()
data class Processing(val username: String) : LoginState()
data class Success(val user: User) : LoginState()
data class Failure(val errorCode: Int) : LoginState()
}
// 使用
fun render(state: LoginState) {
when(state) {
is LoginState.Idle -> showLoginForm()
is LoginState.Processing -> showProgressBar()
is LoginState.Success -> navigateToHome()
is LoginState.Failure -> showErrorDialog()
}
}
2. API响应处理
sealed class ApiResponse<out T> {
data class Success<T>(val body: T) : ApiResponse<T>()
data class Error(val statusCode: Int, val message: String) : ApiResponse<Nothing>()
object NetworkError : ApiResponse<Nothing>()
}
// 使用
fun handleResponse(response: ApiResponse<User>) {
when(response) {
is ApiResponse.Success -> saveUser(response.body)
is ApiResponse.Error -> logError(response.statusCode)
ApiResponse.NetworkError -> showNetworkAlert()
}
}
四、与枚举类的对比
特性 | 密封类 | 枚举类 |
---|---|---|
实例化 | 可带状态(多实例) | 单例 |
类型 | 可以是不同类型 | 相同类型 |
数据携带 | 支持复杂数据结构 | 仅支持简单常量 |
继承 | 支持子类继承 | 不支持 |
模式匹配(when) | 支持智能转换(is 检测) | 仅简单匹配 |
五、常见问题总结
Q:解释Kotlin密封类及其应用场景?
A:
“Kotlin密封类(
sealed class
)是受限的类层次结构,核心解决三大问题:1. 类型安全的状态管理
编译器知晓所有子类,确保
when
表达式全覆盖示例:UI状态(Loading/Success/Error)
2. 类型安全的API响应
封装网络响应:Success(data)/Error(code)
避免
null
和异常传递3. 领域模型表达
精确建模业务概念(如支付方式、文件类型)
支持携带数据的异构类型
关键优势:
编译时安全:消除未处理分支风险
模式匹配优化:智能转换(
is
检测)扩展性:子类可携带独立状态
典型应用:
状态机实现(登录流程)
响应式编程结果处理