Kotlin 中,data class 和普通 class

data class

  1. 自动生成常用方法

    • data class 会自动生成 equals(), hashCode(), toString(), copy() 方法和 componentN() 函数。
    • 这些方法在数据类中非常有用,简化了代码。
  2. 主要用于存储数据

    • data class 主要用于存储数据,即它们通常是只包含属性和简单方法的类。
  3. 声明方式

    • data class 的声明方式为 data class ClassName(val property1: Type, val property2: Type, ...)
  4. 例子

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

普通 class

  1. 不自动生成常用方法

    • 普通类不会自动生成 equals(), hashCode(), toString(), copy() 方法和 componentN() 函数。
    • 如果需要这些方法,需要手动实现。
  2. 更通用

    • 普通类更通用,可以包含更复杂的逻辑,不只是用于存储数据。
  3. 声明方式

    • 普通类的声明方式为 class ClassName
  4. 例子

    kotlin 复制代码
    class 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() 方法
}
相关推荐
Kapaseker4 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker2 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker3 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z5 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton6 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream6 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam6 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker6 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin