Kotlin -- 数据类

本文介绍了Kotlin中的数据类概念,包括数据类的定义、自动生成的方法如equals(), hashCode(), toString()等,以及如何使用copy()函数进行对象复制。同时探讨了数据类的限制条件和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类

我们经常会创建一些数据类, 什么功能也没有, 而仅仅用来保存数据. 在这些类中, 某些常见的功能经常可以由类中保存的数据内容即可自动推断得到. 在 Kotlin 中, 我们将这样的类称为 数据类, 通过 data 关键字标记:

data class User(val name: String, val age: Int)

编译器会根据主构造器中声明的全部属性, 自动推断产生以下成员函数:

  • equals()/hashCode() 函数对,
  • toString() 函数, 输出格式为 "User(name=John, age=42)",
  • componentN() 函数群, 这些函数与类的属性对应, 函数名中的数字 1 到 N, 与属性的声明顺序一致,
  • copy() 函数 (详情见下文).

如果上述任意一个成员函数在类定义体中有明确的定义, 或者从基类继承得到, 那么这个成员函数不会自动生成.

为了保证自动生成的代码的行为一致, 并且有意义, 数据类必须满足以下所有要求:

  • 主构造器至少要有一个参数;
  • 主构造器的所有参数必须标记为 val 或 var;
  • 数据类不能是抽象类, open 类, 封闭(sealed)类, 或内部(inner)类;
  • 数据类不能继承自任何其他类(但可以实现接口).       1.1版本以后 就可以继承类了

在 JVM 上, 如果自动生成的类需要拥有一个无参数的构造器, 那么需要为所有的属性指定默认值 (参见 构造器).

data class User(val name: String = "", val age: Int = 0)

对象复制

我们经常会需要复制一个对象, 然后修改它的 一部分 属性, 但保持其他属性不变. 这就是自动生成的 copy() 函数所要实现的功能. 对于前面示例中的 User 类, 自动生成的 copy() 函数的实现将会是下面这样:

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

有了这个函数, 我们可以编写下面这样的代码:

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

数据类中成员数据的解构

编译器会为数据类生成 组件函数(Component function), 有了这些组件函数, 就可以在 解构声明(destructuring declaration) 中使用数据类:

val jane = User("Jane", 35) 
val (name, age) = jane
println("$name, $age years of age") // 打印结果将是 "Jane, 35 years of age"

标准库中的数据类

Kotlin 的标准库提供了 Pair 和 Triple 类可供使用. 但是, 大多数情况下, 使用有具体名称的数据了是一种更好的设计方式, 因为, 数据类可以为属性指定有含义的名称, 因此可以增加代码的可读性.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值