data class
-
自动生成常用方法:
data class
会自动生成equals()
,hashCode()
,toString()
,copy()
方法和componentN()
函数。- 这些方法在数据类中非常有用,简化了代码。
-
主要用于存储数据:
data class
主要用于存储数据,即它们通常是只包含属性和简单方法的类。
-
声明方式:
data class
的声明方式为data class ClassName(val property1: Type, val property2: Type, ...)
-
例子:
kotlindata class User(val name: String, val age: Int)
普通 class
-
不自动生成常用方法:
- 普通类不会自动生成
equals()
,hashCode()
,toString()
,copy()
方法和componentN()
函数。 - 如果需要这些方法,需要手动实现。
- 普通类不会自动生成
-
更通用:
- 普通类更通用,可以包含更复杂的逻辑,不只是用于存储数据。
-
声明方式:
- 普通类的声明方式为
class ClassName
- 普通类的声明方式为
-
例子:
kotlinclass User(val name: String, val age: Int)
比较
特性 | data class |
普通 class |
---|---|---|
用途 | 主要用于存储数据 | 通用用途,适合包含复杂逻辑的类 |
自动生成方法 | equals() , hashCode() , toString() , copy() , componentN() |
不自动生成,需要手动实现 |
声明方式 | data class User(val name: String, val age: Int) |
class User(val name: String, val age: Int) |
代码简洁性 | 简化了数据类的实现,减少样板代码 | 需要更多的手动实现 |
示例
以下是一个完整的示例,展示了 data class
和普通 class
的区别:
kotlin
// Data class example
data class User(val name: String, val age: Int)
fun main() {
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
println(user1) // 自动生成的 toString() 方法
println(user1 == user2) // 自动生成的 equals() 方法
println(user1.copy(age = 26)) // 自动生成的 copy() 方法
}
// Regular class example
class User(val name: String, val age: Int) {
override fun toString(): String {
return "User(name='$name', age=$age)"
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is User) return false
if (name != other.name) return false
if (age != other.age) return false
return true
}
override fun hashCode(): Int {
var result = name.hashCode()
result = 31 * result + age
return result
}
}
fun main() {
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
println(user1) // 自定义的 toString() 方法
println(user1 == user2) // 自定义的 equals() 方法
}