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()) // 自动生成的 hashCode()
println(user1.toString()) // User(name=Alice, age=25)
解构声明:
val (name, age) = user1
println("Name: $name, Age: $age") // Name: Alice, Age: 25
密封类(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 Success -> println("Success: ${result.data}")
is Error -> println("Error: ${result.message}")
}
}
数据类与密封类的结合
密封类常用于封装多种数据类,实现更安全的状态管理。
示例:
sealed class NetworkResponse
data class Success(val data: String) : NetworkResponse()
data class Failure(val error: String) : NetworkResponse()
object Loading : NetworkResponse()
fun processResponse(response: NetworkResponse) {
when (response) {
is Success -> println("Data: ${response.data}")
is Failure -> println("Error: ${response.error}")
Loading -> println("Loading…")
}
}
数据类的实用扩展
数据类可以结合扩展函数实现更多功能。
示例:
data class Product(val name: String, val price: Double)
fun Product.discountedPrice(discount: Double): Double {
return price * (1 – discount)
}
val product = Product("Laptop", 1000.0)
println("Discounted price: ${product.discountedPrice(0.1)}") // 900.0
密封类的模式匹配优势
密封类的 when 表达式无需 else 分支,编译器会检查所有可能的情况。
示例:
sealed class Shape
data class Circle(val radius: Double) : Shape()
data class Square(val side: Double) : Shape()
fun calculateArea(shape: Shape): Double {
return when (shape) {
is Circle -> Math.PI * shape.radius * shape.radius
is Square -> shape.side * shape.side
}
}
通过数据类和密封类,Kotlin 提供了更简洁、安全的代码组织方式,适用于状态管理、API 响应封装等场景。




