目录
在Kotlin中,密封类(Sealed Class)和数据类(Data Class)都是强大的语言特性,但它们解决的问题和使用场景完全不同。让我们通过详细的对比来理解它们的区别。
核心概念差异
数据类(Data Class)
设计目的: 专注于数据持有和值语义
data class User(
val name: String,
val age: Int,
val email: String
)
密封类(Sealed Class)
设计目的: 定义受限的类层次结构,表示有限的可能类型
sealed class NetworkResult<T>
data class Success<T>(val data: T) : NetworkResult<T>()
data class Error(val message: String, val code: Int) : NetworkResult<Nothing>()
object Loading : NetworkResult<Nothing>()
详细特性对比
1. 继承和扩展性
数据类:
-
默认是final的,不能被继承
-
不能继承其他类(但可以实现接口)
-
封闭的、完整的定义
// ❌ 编译错误 - Data class cannot be abstract, open, sealed or inner
// open data class User(val name: String)
// ❌ 编译错误 - Data class cannot be abstract, open, sealed or inner
// data class Student extends User
密封类:
-
抽象类的一种特殊形式
-
所有子类必须在同一文件中声明(Kotlin 1.5后放宽到同一模块)
-
开放的、可扩展的层次结构
sealed class PaymentMethod {
data class CreditCard(val number: String, val expiry: String) : PaymentMethod()
data class PayPal(val email: String) : PaymentMethod()
object Cash : PaymentMethod()
// 可以在同一文件中添加新子类
data class BankTransfer(val account: String) : PaymentMethod()
}
2. 自动生成的方法
数据类: 自动生成全套实用方法
data class Person(val name: String, val age: Int)
// 自动生成:
// - equals()/hashCode()
// - toString()
// - copy()
// - componentN() 函数(用于解构)
密封类: 不自动生成任何方法,依赖子类实现
sealed class Shape {
// 子类需要自己决定是否使用data关键字
data class Circle(

最低0.47元/天 解锁文章
372

被折叠的 条评论
为什么被折叠?



