Kotlin 数据类详解

在 Kotlin 中,我们经常需要创建一些仅用于保存数据的类。这些类被称为数据类(Data Classes),通过 data 关键字来标记。Kotlin 会自动为这些类生成一些实用的函数,这样我们就无需手动编写它们了。

什么是数据类?

数据类是一种专门用来持有数据的类。Kotlin 会自动提供以下有用的方法:

  • equals() – 用于检查两个对象是否相等
  • hashCode() – 在基于哈希的集合(如 HashMap)中存储对象时使用
  • toString() – 获取对象的字符串表示形式
  • copy() – 用于复制对象,同时允许修改某些属性的值

示例:

data class Student(val name: String, val rollNo: Int)

当我们创建这样一个类时,Kotlin 会根据主构造函数中的参数(在这个例子中是 INLINECODE3b683cde 和 INLINECODEd75c234f)自动生成上述函数。

创建数据类的规则 –

为了确保数据类能够正常工作,Kotlin 制定了一些必须遵守的规则:

  • 主构造函数必须至少包含一个参数。
  • 主构造函数的所有参数必须标记为 INLINECODE7c11ef50 或 INLINECODEd3e99bac。
  • 数据类不能是抽象、开放、密封或内部类。
  • 数据类可以实现接口,但不能继承其他类。

使用 toString()

toString() 函数会返回一个字符串,其中包含主构造函数中定义的所有属性值。

示例:

Kotlin


CODEBLOCK_d3dfeb7f

输出:

Person(name=man, roll=1, height=50)

> 注意: 但是,如果你在类体内部定义了属性(而不是在构造函数中),toString() 将不会包含这些属性。

示例:

Kotlin


CODEBLOCK_a21c4f0e

输出:

Person(name=manish)
70

在这里,height 并没有被 toString() 函数使用。

使用 copy()

有时,我们需要复制一个对象,但只想修改其中的一两个值。这就是 copy() 函数大显身手的时候。

copy() 的特性

  • 它会复制主构造函数中定义的所有参数或成员。
  • 如果在类体中定义了属性,两个对象的主构造函数参数可以相同,但类体内的属性值可以不同。

copy() 的声明

fun copy(name: String = this.x, age: Int = this.y) = user(x, y)

其中 user 是一个数据类:user(String, Int)。

示例

Kotlin


CODEBLOCK_23c920ab

输出:

manish, 18 has 100 cm height  
rahul, 18 has 90 cm height  
manish, 18 has 110 cm height

由此可见,即使主构造函数的值被复制了,类体内部的属性(如 height)仍然可以独立修改。

使用 equals() 和 hashCode()

  • hashCode() 函数返回对象的 哈希码 值。
  • equals() 方法如果两个对象具有相同的内容则返回 true,它的作用类似于 "==",但在处理 FloatDouble 值时有所不同。

hashCode() 的声明:

open fun ****hashCode****(): Int

hashCode() 的特性

  • 同一对象多次调用生成的哈希码总是相等的。
  • 如果根据 equals() 方法两个对象相等,那么它们返回的哈希码也必须相同。

Kotlin


CODEBLOCK_191e3ccf

输出:

835510190  
-938448478  
835510190  
man1 == man2: false  
man1 == man3: true

解释:

man1 和 man3 具有相同的对象内容,因此它们相等,并且具有相同的哈希码值。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/23695.html
点赞
0.00 平均评分 (0% 分数) - 0