Kotlin 数据类与密封类详解
数据类(Data Class)
数据类是 Kotlin 中用于存储数据的特殊类,自动生成 equals()、hashCode()、toString() 和 copy() 等方法,简化了数据模型的实现。
定义一个数据类:
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)
// copy() 方法允许修改部分属性
val user3 = user1.copy(age = 26)
println(user3) // 输出:User(name=Alice, age=26)
数据类的限制:
- 主构造函数必须至少有一个参数。
- 参数必须标记为 val 或 var。
- 不能是抽象类、开放类(open)、密封类或内部类。
密封类(Sealed Class)
密封类用于表示受限的类层次结构,子类必须定义在同一个文件中,常用于状态或表达式的封装。
定义一个密封类及其子类:
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
使用 when 表达式处理密封类:
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
Result.Loading -> println("Loading…")
}
}
val success = Result.Success("Loaded successfully")
handleResult(success) // 输出:Data: Loaded successfully
密封类的优势:
- 子类类型固定,编译器可检查 when 表达式是否覆盖所有情况。
- 适合实现状态机、API 响应等场景。
数据类与密封类的结合
数据类常用于密封类的子类,例如网络请求结果封装:
sealed class ApiResponse {
data class Success(val data: User) : ApiResponse()
data class Failure(val error: String) : ApiResponse()
}
fun processResponse(response: ApiResponse) {
when (response) {
is ApiResponse.Success -> println("User: ${response.data}")
is ApiResponse.Failure -> println("Error: ${response.error}")
}
}
实际应用示例
以下是一个完整的示例,结合数据类和密封类实现用户管理:
data class User(val id: Int, val name: String)
sealed class UserAction {
data class Add(val user: User) : UserAction()
data class Delete(val id: Int) : UserAction()
object Refresh : UserAction()
}
fun executeAction(action: UserAction) {
when (action) {
is UserAction.Add -> println("Added user: ${action.user}")
is UserAction.Delete -> println("Deleted user ID: ${action.id}")
UserAction.Refresh -> println("Refreshing list…")
}
}
val action = UserAction.Add(User(1, "Bob"))
executeAction(action) // 输出:Added user: User(id=1, name=Bob)
通过数据类和密封类的组合,可以高效地实现类型安全的数据处理和状态管理。




