当前位置: 首页 > news >正文

Kotlin数据类与密封类实战指南

Kotlin 数据类与密封类详解

数据类(Data Class)

数据类是 Kotlin 中用于存储数据的特殊类,自动生成equals()hashCode()toString()copy()等方法,简化了数据模型的实现。

定义一个数据类:

data class User(val name: String, val age: Int)

自动生成的方法示例:

val user1 = User("Alice", 25) val user2 = User("Alice", 25) println(user1 == user2) // true,自动生成 equals() println(user1.hashCode()) // 相同值生成相同哈希码 println(user1.toString()) // 输出:User(name=Alice, age=25) // copy() 方法允许修改部分属性 val user3 = user1.copy(age = 26) println(user3) // 输出:User(name=Alice, age=26)

数据类的限制:

  • 主构造函数必须至少有一个参数。
  • 参数必须标记为valvar
  • 不能是抽象类、开放类(open)、密封类或内部类。
密封类(Sealed Class)

密封类用于表示受限的类层次结构,子类必须定义在同一个文件中,常用于状态或表达式的封装。

定义一个密封类及其子类:

sealed class Result { data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result() }

使用when表达式处理密封类:

fun handleResult(result: Result) { when (result) { is Result.Success -> println("Data: ${result.data}") is Result.Error -> println("Error: ${result.message}") Result.Loading -> println("Loading...") } } val success = Result.Success("Loaded successfully") handleResult(success) // 输出:Data: Loaded successfully

密封类的优势:

  • 子类类型固定,编译器可检查when表达式是否覆盖所有情况。
  • 适合实现状态机、API 响应等场景。
数据类与密封类的结合

数据类常用于密封类的子类,例如网络请求结果封装:

sealed class ApiResponse { data class Success(val data: User) : ApiResponse() data class Failure(val error: String) : ApiResponse() } fun processResponse(response: ApiResponse) { when (response) { is ApiResponse.Success -> println("User: ${response.data}") is ApiResponse.Failure -> println("Error: ${response.error}") } }
实际应用示例

以下是一个完整的示例,结合数据类和密封类实现用户管理:

data class User(val id: Int, val name: String) sealed class UserAction { data class Add(val user: User) : UserAction() data class Delete(val id: Int) : UserAction() object Refresh : UserAction() } fun executeAction(action: UserAction) { when (action) { is UserAction.Add -> println("Added user: ${action.user}") is UserAction.Delete -> println("Deleted user ID: ${action.id}") UserAction.Refresh -> println("Refreshing list...") } } val action = UserAction.Add(User(1, "Bob")) executeAction(action) // 输出:Added user: User(id=1, name=Bob)

通过数据类和密封类的组合,可以高效地实现类型安全的数据处理和状态管理。

http://www.jsqmd.com/news/468523/

相关文章:

  • DeepGen 1.0:上海创新研究院等院校联手打造“轻量级全能画师“
  • Kafka全链路防丢消息:生产者到消费者全解析
  • openclaw 笔记及注意事项
  • People dont hate Chinese people.
  • 西南财经大学团队突破性解决大模型部署难题
  • 危机解除≠回到从前:输入性通胀压力下A股的走势与投资方向洞察
  • 2026年3月12日 十二生肖 今日运势
  • Flutter 三方库 text_indexing 的鸿蒙化适配指南 - 让海量文本搜索快如闪电,打造鸿蒙应用极速全文检索引擎
  • 基于TabPFN算法的回归问题-代码运行
  • javaDay05
  • AI智能体加速工艺仿真:架构师如何用AI优化仿真模型?
  • 线性代数直觉(六):向量通过矩阵
  • LeetCode 1009 476 数字的补数
  • 职场上要懂的思维模型系列(第一章)
  • 5.7 化学反应速率 化学平衡
  • 什么是纵深防护
  • AcWing 3473. 鸡兔同笼
  • 2026 如何快速接入外汇行情 API - 实战指南
  • phar反序列化专题
  • Gitlab安装与使用
  • 迅雷下载速度慢怎么办_教你如何提高30倍
  • OpenClaw实战-NAS配置从0到1详细教程及踩坑记录
  • 195.s域的1/s采用双线性变换法变到Z域如何实现,采用双线性变换法
  • 分析和预测快速约会中双方能否成功配对
  • DRAM内存访问协议核心解析:DRAM命令交互与时序约束全解(JEDEC通用标准)
  • 鸿蒙常见问题分析二十四:ListItemGroup如何使用三元运算符
  • Go 语言基础进阶:指针、init、匿名函数/闭包、defer
  • RabbitMQ整合springboot
  • Java基于微信小程序的社区垃圾回收管理系统【附源码、文档说明】
  • 2026年知网AIGC检测不通过?这4款降AI率工具亲测有效