在 Kotlin 中,data class
是一种专门用来存储数据的类。与普通类相比,data class
提供了简化数据存储的语法,并且自动生成了一些常用的方法,例如 toString()
、equals()
、hashCode()
和 copy()
。
1. 定义 data class
data class
的定义非常简单,只需要在 class
前加上 data
关键字即可:
data class Person(val name: String, val age: Int)
2. data class
的自动生成功能
使用 data class
,Kotlin 自动为你生成以下功能:
toString()
: 用于友好地输出对象的字符串表示。equals()
和hashCode()
: 用于对象比较(基于内容,而不是引用)。copy()
: 用于创建对象的副本,可以选择修改部分属性。componentN()
: 按属性顺序为每个属性生成componentN()
方法,支持解构声明。
示例
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
的限制
-
主构造函数必须至少有一个参数:
data class Empty() // 报错:必须至少包含一个参数
-
主构造函数的参数必须是
val
或var
:data class InvalidDataClass(name: String) // 报错:name 不是 val 或 var
-
data class
不能是抽象类、密封类或内部类:abstract data class AbstractDataClass(val id: Int) // 报错
4. copy()
方法
copy()
方法是 data class
的一个重要特性。它允许你复制一个对象,并根据需要修改部分属性,而无需手动创建新对象。
示例
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
的属性可以直接解构为多个变量。
示例
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
可以嵌套在另一个类中,用于更复杂的数据结构。
示例
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()
方法,适合用于对象比较和哈希集合。
示例
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 的)。
- 可以自定义方法,但需注意保持数据对象的纯粹性。