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 = 编译期代码生成 + 设计意图标注,零运行时开销。

相关推荐
金銀銅鐵14 小时前
一个 4 个常量的枚举,Kotlin 在字节码里生成了什么
jvm·kotlin
Easyhood2 天前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
松仔log3 天前
Kotlin中级——callbackFlow
java·前端·kotlin
zh_xuan3 天前
kotlin常见面试题
开发语言·kotlin·面试题
mmsx3 天前
耳切法切带洞多边形:论文能跑通,真实数据为什么崩
android·kotlin
Kapaseker3 天前
Kotlin 又要加语法糖了:这次轮到 if-else
android·kotlin
雨白4 天前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
灿飞4 天前
Kotlin与Java虚拟机十一:类与属性:构造顺序、backing field 与显式 backing field
java·后端·kotlin
传奇开心果4 天前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin