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 分支
  • 数据类默认生成的方法可通过显式重写自定义

通过合理使用数据类和密封类,可以显著减少样板代码,提高类型安全性,并简化状态管理逻辑。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐