kotlin 关键字data

一、对 class 加 data

编译器生成的方法(都基于主构造参数):

生成物 功能 如果手写会怎样
equals() 逐字段比较 省掉 20 行模板代码,且字段变更时自动同步(手写版容易漏改)
hashCode() 逐字段 * 31 叠加 同上,且保证与 equals() 契约一致
toString() 拼接 User(id=1, name=Tom) 纯调试便利
copy() 调用主构造的新实例 不可变数据建模的关键
componentN() 按位置返回第 N 个属性的 getter 支撑解构 val (a, b) = user

它没有做的事:

❌ 没有基类、没有接口、没有注解注入------生成的就是普通方法

❌ 不影响内存布局,实例和普通类一样

❌ 不会自动实现 Serializable/Parcelable

❌ equals 比较只看主构造参数,函数体里声明的属性不参与:

二、对 object 加 data

普通 object 是饿汉单例,data 对它只改一个方法:toString()。

三、为什么要有这个关键字

去掉 data 你也能手写全部方法------它解决的是三个实际问题:

1、模板代码:5 个方法 × N 个字段,手写又长又易错

2、同步成本:加字段时自动更新 equals/hashCode/copy,手写版经常漏(尤其 copy 漏新参数)

3、语义表达:读代码的人一眼知道这是数据模型;IDE/库也能据此做处理(如 when 穷尽检查提示、序列化库的约定)

所以严格说:data = 编译期代码生成 + 设计意图标注,零运行时开销。

相关推荐
传奇开心果编程4 小时前
【Jetpack Compose娓娓道来】 第25课:ViewModel就是UI界面的大脑
android·kotlin·移动开发·jetpack compose·编程语言理论·编程框架·声明式ui
汪海游龙1 天前
流式回复结尾的那一下闪:逐帧定位 Compose 聊天列表的三处布局跳动
android·性能优化·kotlin
传奇开心果编程1 天前
【Compose Multiplatform跨端声明式UI实用技术】第20课:CMP跨平台经典示例深度解析
kotlin·移动开发·跨平台·编程语言理论·开发范式·编程框架·声明式ui
敲代码的瓦龙1 天前
Jetpack?lifecycle!!!
android·kotlin
Kapaseker1 天前
为什么程序员始终无法彻底解决内存泄漏?
android·kotlin
汤姆宝库1 天前
推理工程深拆:调度、量化与投机解码
android·开发语言·kotlin
传奇开心果2 天前
【Compose Multiplatform跨端声明式UI实用技术】第9课:跨平台 ViewModel 与状态架构
android·kotlin
andyweike2 天前
kotlin dsl library工程怎么配置
android·开发语言·kotlin
high一马平川3 天前
# SystemUI Dagger2 精读 · 第 2 章 @Inject:1200 处构造注入,和 1 处例外
android·java·kotlin