Kotlin 的数据类

在 Kotlin 中,‌数据类(Data Class) ‌ 是专门为存储数据而设计的类,通过 data 关键字声明。它会‌自动生成 ‌常用方法(如 toString()equals()hashCode()copy()),并支持‌析构声明‌,极大简化了数据模型的编写。以下是详细解析:


一、‌基本语法与特性

1. ‌定义数据类

kotlin 复制代码
data class User(
    val name: String,
    val age: Int,
    val email: String = "" // 带默认值的参数
)

2. ‌自动生成的方法

  • ‌**toString()** ‌

    输出类名和所有属性的值:
    User(name=Alice, age=30, email=alice@example.com)

  • ‌**equals()hashCode()** ‌

    基于所有主构造函数属性判断对象相等性:

    ini 复制代码
    kotlinCopy Code
    val user1 = User("Alice", 30)
    val user2 = User("Alice", 30)
    println(user1 == user2) // true
  • ‌**copy()** ‌

    创建对象的浅拷贝,支持修改部分属性:

    go 复制代码
    val user3 = user1.copy(age = 31) // 仅修改 age
  • ‌**componentN()** ‌

    按属性声明顺序生成 component1()component2() 等函数,支持析构:

    kotlin 复制代码
    val (name, age, email) = user1 // 直接解构属性

二、‌使用场景

1. ‌DTO(数据传输对象)

用于网络请求或数据库交互的模型:

kotlin 复制代码
data class ApiResponse(
    val code: Int,
    val message: String,
    val data: User?
)

2. ‌状态管理

表示 UI 或业务逻辑的状态:

kotlin 复制代码
data class LoginState(
    val isLoading: Boolean,
    val error: String?,
    val user: User?
)

3. ‌简化集合操作

结合 mapfilter 处理对象集合:

ini 复制代码
val users = listOf(User("Alice", 30), User("Bob", 25))
val names = users.map { it.name } // ["Alice", "Bob"]

三、‌注意事项与限制

1. ‌主构造函数要求

  • 必须至少有一个 valvar 参数。
  • 不能是 abstractopensealedinner 类。

2. ‌继承与实现

数据类可以继承其他类或实现接口:

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

3. ‌手动重写方法

如需自定义行为,可显式重写生成的方法:

kotlin 复制代码
data class CustomUser(val id: String, val name: String) {
    override fun toString(): String {
        return "#$id: $name"
    }
}

4. ‌深拷贝问题

copy() 是浅拷贝,引用类型属性不会复制:

kotlin 复制代码
data class Company(val name: String, val employees: MutableList<User>)

val company1 = Company("Tech", mutableListOf(User("Alice", 30)))
val company2 = company1.copy()
company2.employees.add(User("Bob", 25))

// company1.employees 也会包含 Bob(浅拷贝问题)

四、‌数据类 vs 普通类

特性 数据类 普通类
toString() 自动生成(显示属性值) 默认输出类名和哈希值
equals()/hashCode 基于所有主构造函数属性 基于对象引用
copy() 自动生成 需手动实现
析构支持 自动生成 componentN() 需手动实现
适用场景 纯数据载体 含复杂逻辑的类

五、‌与 JSON 解析库结合

数据类常用于反序列化 JSON 数据(需配合库如 GsonMoshikotlinx.serialization):

less 复制代码
// 使用 kotlinx.serialization
@Serializable
data class Post(
    val id: Int,
    val title: String,
    val content: String
)

// 反序列化 JSON 字符串
val json = """{"id": 1, "title": "Hello", "content": "World"}"""
val post = Json.decodeFromString<Post>(json)

六、‌总结

数据类的核心优势:

  1. 代码简洁‌:自动生成常用方法,减少样板代码。
  2. 语义明确‌:明确表示类用于存储数据。
  3. 功能实用‌:支持析构、拷贝和集合操作。

适用场景‌:

  • 需要频繁比较、复制或打印数据的类。
  • 作为函数参数或返回值传递的轻量级对象。
  • 与 JSON 等序列化/反序列化技术结合使用。
相关推荐
三8441 小时前
PHP Session 反序列化(2):漏洞根因 —— 序列化处理器错位与对象注入
android·web安全·php·反序列化·session
天空之城--1 小时前
Android行业一周动态:编码趋势与行业资讯汇总
android·性能优化·架构·kotlin·android jetpack
Co_Hui3 小时前
Android Handler 内存泄漏分析
android
张小姐的猫3 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
Anhty7 小时前
叮咚变声器上手实测,iOS短板、安卓悬浮窗使用感受分享
android·人工智能·功能测试·ios·智能手机
方白羽7 小时前
OkHttp 5.3 隐形变更引发的线上偶发崩溃复盘
android·app·客户端
EatFan9 小时前
【实战经验】uni-app使用 SSE 踩坑,EventSource不支持怎么办?
android·后端·ios·uni-app
JMchen9 小时前
第 2 篇|Kotlin 进阶 —— 集合、循环与条件表达式
android·kotlin
律宏阔9 小时前
Android 自定义 Launcher 加载第三方 App Widget
android
律宏阔10 小时前
Android 9 开发板实现系统侧滑返回
android