Kotlin数据类与密封类实战
·
Kotlin 数据类与密封类详解
数据类(Data Class)
数据类是 Kotlin 中用于简化数据模型定义的语法糖,自动生成 equals()、hashCode()、toString() 等方法,适合存储纯数据。
定义数据类
data class User(val name: String, val age: Int)
自动生成的功能
- 示例代码:
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
println(user1 == user2) // true(自动生成 equals)
println(user1.hashCode()) // 相同值生成相同哈希码
println(user1.toString()) // 输出: User(name=Alice, age=25)
解构声明
val (name, age) = user1
println("$name is $age years old") // 输出: Alice is 25 years old
复制对象
val olderUser = user1.copy(age = 30)
println(olderUser) // 输出: User(name=Alice, age=30)
密封类(Sealed Class)
密封类用于限制类的继承结构,所有子类必须在同一文件中声明,常用于表示有限的状态或类型。
定义密封类
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
}
模式匹配应用
fun handleResult(result: Result) = when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
}
val success = Result.Success("Loaded")
val error = Result.Error("404 Not Found")
handleResult(success) // 输出: Data: Loaded
handleResult(error) // 输出: Error: 404 Not Found
与数据类结合
sealed class NetworkResponse {
data class Success(val json: String) : NetworkResponse()
data class Failure(val code: Int) : NetworkResponse()
object Loading : NetworkResponse()
}
状态机示例
fun process(response: NetworkResponse) = when (response) {
is NetworkResponse.Success -> parseJson(response.json)
is NetworkResponse.Failure -> logError(response.code)
NetworkResponse.Loading -> showProgressBar()
}
实际应用场景
数据类用于 API 响应
data class ApiResponse<T>(
val status: String,
val data: T,
val timestamp: Long
)
val response = ApiResponse("success", user1, System.currentTimeMillis())
密封类处理 UI 状态
sealed class UiState {
data class Content(val items: List<String>) : UiState()
data class Error(val msg: String) : UiState()
object Loading : UiState()
}
fun render(state: UiState) = when (state) {
is UiState.Content -> showList(state.items)
is UiState.Error -> showError(state.msg)
UiState.Loading -> showSpinner()
}
注意事项
- 数据类主构造函数需至少有一个参数
- 密封类子类可为对象、数据类或普通类
when表达式处理密封类时无需else分支- 数据类默认生成的方法可通过显式重写自定义
通过合理使用数据类和密封类,可以显著减少样板代码,提高类型安全性,并简化状态管理逻辑。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)