Kotlin 数据类与密封类
在 Kotlin 中,数据类和密封类能够帮助开发者更简洁、安全地管理数据。数据类简化了数据存储对象的定义,而密封类则提供了一种更严格的方式来定义受限的类型层次结构。
一、数据类:简化数据存储
使用场景
当你需要一个类主要用于存储数据时,数据类就派上用场了。它们可以帮助你避免编写大量的样板代码,例如生成 equals()
、hashCode()
、toString()
等方法。
声明
使用 data
关键字声明一个数据类:
data class User(val name: String, val age: Int)
特性
- 自动生成方法: 编译器会自动生成
equals()
、hashCode()
、toString()
、copy()
和componentN()
等方法。 - 简洁性: 无需手动编写上述方法,代码更加简洁易读。
用法
val user1 = User("Alice", 30)
val user2 = User("Bob", 25)
println(user1) // 输出:User(name=Alice, age=30)
println(user1 == user2) // 输出:false
二、密封类:定义受限的类型层次结构
使用场景
当你需要表示一种有限的、预定义的类型集合时,密封类非常有用。例如,网络请求的结果可以是成功或失败,这两种状态可以使用密封类来表示。
声明
使用 sealed
关键字声明一个密封类:
sealed class Result<out T> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val message: String) : Result<Nothing>()
}
特性
- 受限的子类: 所有子类都必须在密封类的定义中嵌套。
- 穷尽性检查: 当使用
when
表达式处理密封类的实例时,编译器会强制检查是否覆盖了所有可能的子类。
用法
fun handleResult(result: Result<String>) {
when (result) {
is Result.Success -> println("Success: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
}
}
希望这篇教程能够帮助你理解和使用 Kotlin 中的数据类和密封类。