Kotlin密封类与数据类:深度对比与实战指南


在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(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值