Kotlin的data class

在 Kotlin 中,data class 是一种专门用来存储数据的类。与普通类相比,data class 提供了简化数据存储的语法,并且自动生成了一些常用的方法,例如 toString()、equals()、hashCode() 和 copy()。

1. 定义 data class

data class 的定义非常简单,只需要在 class 前加上 data 关键字即可:

kotlin 复制代码
data class Person(val name: String, val age: Int)

2. data class 的自动生成功能

使用 data class,Kotlin 自动为你生成以下功能:

  • toString(): 用于友好地输出对象的字符串表示。
  • equals() 和 hashCode(): 用于对象比较(基于内容,而不是引用)。
  • copy(): 用于创建对象的副本,可以选择修改部分属性。
  • componentN() : 按属性顺序为每个属性生成 componentN() 方法,支持解构声明。
示例
kotlin 复制代码
data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person("Alice", 25)

    // 自动生成的 toString()
    println(person1)  // 输出: Person(name=Alice, age=25)

    // 自动生成的 equals()
    val person2 = Person("Alice", 25)
    println(person1 == person2)  // 输出: true

    // 自动生成的 copy()
    val person3 = person1.copy(age = 30)
    println(person3)  // 输出: Person(name=Alice, age=30)

    // 自动生成的 componentN()
    val (name, age) = person1
    println("Name: $name, Age: $age")  // 输出: Name: Alice, Age: 25
}

3. data class 的限制

  • 主构造函数必须至少有一个参数:

    kotlin 复制代码
    data class Empty() // 报错:必须至少包含一个参数
  • 主构造函数的参数必须是 val 或 var:

    kotlin 复制代码
    data class InvalidDataClass(name: String) // 报错:name 不是 val 或 var
  • data class 不能是抽象类、密封类或内部类:

    kotlin 复制代码
    abstract data class AbstractDataClass(val id: Int) // 报错

4. copy() 方法

copy() 方法是 data class 的一个重要特性。它允许你复制一个对象,并根据需要修改部分属性,而无需手动创建新对象。

示例
kotlin 复制代码
data class Product(val name: String, val price: Double, val stock: Int)

fun main() {
    val originalProduct = Product("Laptop", 999.99, 50)
    val updatedProduct = originalProduct.copy(price = 899.99, stock = 30)

    println(originalProduct)  // 输出: Product(name=Laptop, price=999.99, stock=50)
    println(updatedProduct)   // 输出: Product(name=Laptop, price=899.99, stock=30)
}

5. 解构声明

通过 componentN() 方法,data class 的属性可以直接解构为多个变量。

示例
kotlin 复制代码
data class Point(val x: Int, val y: Int)

fun main() {
    val point = Point(10, 20)
    val (x, y) = point

    println("x: $x, y: $y")  // 输出: x: 10, y: 20
}

6. 嵌套 data class

data class 可以嵌套在另一个类中,用于更复杂的数据结构。

示例
kotlin 复制代码
data class Address(val city: String, val street: String)
data class User(val name: String, val address: Address)

fun main() {
    val user = User("Alice", Address("New York", "5th Avenue"))
    println(user)  // 输出: User(name=Alice, address=Address(city=New York, street=5th Avenue))
}

7. hashCode() 和 equals()

data class 自动生成基于内容的 equals() 和 hashCode() 方法,适合用于对象比较和哈希集合。

示例
kotlin 复制代码
data class Item(val id: Int, val name: String)

fun main() {
    val item1 = Item(1, "Pen")
    val item2 = Item(1, "Pen")
    val itemSet = setOf(item1, item2)

    println(item1 == item2)  // 输出: true
    println(itemSet.size)    // 输出: 1
}

8. data class 表格分析

特性 功能
toString() 返回类的字符串表示(属性及其值)。
equals() 基于内容的相等性判断。
hashCode() 基于属性值生成哈希值,适用于哈希集合(如 HashSet 和 HashMap)。
copy() 创建对象副本,并允许修改部分属性值。
componentN() 支持解构声明,将对象属性解构为独立的变量。
嵌套 可以嵌套使用,用于创建复杂的嵌套数据结构。

9. 适用场景

  • 数据存储 :data class 非常适合表示数据结构(如模型类、DTO、VO 等)。
  • 集合操作 :配合 map、filter 等集合函数使用。
  • 解构操作:轻松解构数据到多个变量。
  • 对象比较:需要基于内容而非引用的比较时非常方便。

通过 data class,Kotlin 提供了一种高效、简洁的方式来管理和操作数据结构。

10. 注意事项

  • 主构造函数的参数会自动作为 val 或 var 属性,且只能是这些属性会参与生成的默认方法。
  • data class 不支持继承(它们默认是 final 的)。
  • 可以自定义方法,但需注意保持数据对象的纯粹性。
相关推荐
kyriewen34 分钟前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒1 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫1 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus2 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
孟陬3 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
Zhao-Jichao3 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
Highcharts.js4 小时前
智能数据分析组件Orbit 正式发布与快速上手体验教程
前端·人工智能·信息可视化·数据分析系统·highcharts·orbit·智能可视化
螺丝钉tina4 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
小天源5 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库
俩个逗号。。6 小时前
Kotlin flow 详解
android·开发语言·kotlin