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() 方法
}
相关推荐
程序员清风4 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin
小宋10215 小时前
用户点踩后怎么变成回归用例:请求快照、反馈聚类与复现率验收
人工智能·回归·kotlin·聚类
传奇开心果编程7 小时前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
kotlin·移动开发·跨平台·cmp·编程语言理论·编程框架·声明式ui
2501_944525768 小时前
开源鸿蒙平台 KMP_CMP 三方库「Kaml」适配全流程
开源·kotlin·harmonyos
传奇开心果编程1 天前
从替代到粒度:Compose Multiplatform 的决策模式重构已开启跨平台新时代
kotlin·移动开发·跨平台·cmp·编程语言理论·编程框架·声明式ui
三少爷的鞋1 天前
Kotlin 协程,重点就在「协」这个字上
android·kotlin
传奇开心果编程2 天前
【Jetpack Compose娓娓道来】 第25课:ViewModel就是UI界面的大脑
android·kotlin·移动开发·jetpack compose·编程语言理论·编程框架·声明式ui
汪海游龙3 天前
流式回复结尾的那一下闪:逐帧定位 Compose 聊天列表的三处布局跳动
android·性能优化·kotlin
传奇开心果编程3 天前
【Compose Multiplatform跨端声明式UI实用技术】第20课:CMP跨平台经典示例深度解析
kotlin·移动开发·跨平台·编程语言理论·开发范式·编程框架·声明式ui
敲代码的瓦龙3 天前
Jetpack?lifecycle!!!
android·kotlin