kotlin中密封类介绍

发布于:2025-08-15 ⋅ 阅读:(11) ⋅ 点赞:(0)
一、密封类核心概念

核心特性

  1. 受限继承子类必须在同一文件或嵌套类中定义

  2. 封闭性:编译器知道所有可能的子类型

  3. 抽象性:不能直接实例化,类似抽象类

二、基础语法与使用
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检测)

  • 扩展性:子类可携带独立状态

典型应用

  1. 状态机实现(登录流程)

  2. 响应式编程结果处理