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

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言

想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equalshashCode,直接省时省力!再想想需要多种状态管理的场景,比如实现状态机,密封类 是不是你的救星?最后别忘了 枚举类,它就是你控制常量值的一把好手。这篇博客带你从数据类到密封类,再到枚举类,一次性解锁 Kotlin 的核心玩法,干货满满,笑点不断,看完你也是 Kotlin 的铁杆粉丝!
在这里插入图片描述


一、背景

Kotlin,作为 JetBrains 打造的现代化 JVM 语言,其主要特性之一就是简洁优雅。尤其是 数据类密封类枚举类,不仅在语法层面给开发者极大的便利,也在实际业务逻辑中让代码更加清晰易读。

  1. 数据类:解决数据存储、操作场景下的冗余代码问题。
  2. 密封类:为状态管理和类型安全提供极大便利。
  3. 枚举类:简化常量管理,便于维护。

无论是高并发的服务端,还是极简的 Android 应用开发,这三类工具都是 Kotlin 开发者必不可少的利器。


二、核心概念

  1. 数据类(Data Class)
    数据类是用来表示数据的结构。Kotlin 为其生成了 equals()hashCode()toString() 等方法,减少样板代码。

    data class User(val name: String, val age: Int)
    val user = User("Alice", 25)
    println(user) // 输出:User(name=Alice, age=25)
    
  2. 密封类(Sealed Class)
    密封类是用来表示受限的类层次结构,通常用于状态管理或复杂逻辑的分类。

    sealed class Result {data class Success(val data: String) : Result()data class Failure(val error: String) : Result()
    }
    val result: Result = Result.Success("OK")
    
  3. 枚举类(Enum Class)
    枚举类用于定义一组常量值,常用于状态值或类型定义。

    enum class Direction {NORTH, SOUTH, EAST, WEST
    }
    println(Direction.NORTH) // 输出:NORTH
    

三、实现

  1. 安装 Kotlin 环境,推荐使用 IntelliJ IDEA。
  2. 创建一个 Kotlin 项目,添加依赖(如果需要)。
  3. 编写示例代码,利用数据类、密封类和枚举类完成小型逻辑实现。

四、示例

我们通过三个具体案例,详细说明 Kotlin 数据类、密封类和枚举类的使用场景,提供完整代码示例以及运行结果。


案例 1:密封类管理网络请求状态

描述:
在网络请求中,通常会有三种状态:加载中、请求成功、请求失败。通过密封类统一管理这些状态,可以使代码更清晰、可维护。

完整代码:

sealed class NetworkState {object Loading : NetworkState()data class Success(val data: String) : NetworkState()data class Error(val message: String) : NetworkState()
}fun handleNetworkState(state: NetworkState) {when (state) {is NetworkState.Loading -> println("当前状态:Loading... 正在加载数据")is NetworkState.Success -> println("当前状态:Success! 数据内容:${state.data}")is NetworkState.Error -> println("当前状态:Error! 错误信息:${state.message}")}
}fun main() {val loadingState = NetworkState.Loadingval successState = NetworkState.Success("用户数据加载成功!")val errorState = NetworkState.Error("网络连接失败!")handleNetworkState(loadingState)handleNetworkState(successState)handleNetworkState(errorState)
}

运行结果:

当前状态:Loading... 正在加载数据  
当前状态:Success! 数据内容:用户数据加载成功!  
当前状态:Error! 错误信息:网络连接失败!  

案例 2:枚举类控制方向移动

描述:
通过枚举类控制方向的移动逻辑,并打印每次移动的状态。

完整代码:

enum class Direction {NORTH, SOUTH, EAST, WEST
}fun move(direction: Direction) {when (direction) {Direction.NORTH -> println("正在向北移动 🚶‍♂️")Direction.SOUTH -> println("正在向南移动 🚶‍♂️")Direction.EAST -> println("正在向东移动 🚶‍♂️")Direction.WEST -> println("正在向西移动 🚶‍♂️")}
}fun main() {val directions = listOf(Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST)for (direction in directions) {move(direction)}
}

运行结果:

正在向北移动 🚶‍♂️  
正在向东移动 🚶‍♂️  
正在向南移动 🚶‍♂️  
正在向西移动 🚶‍♂️  

案例 3:数据类实现用户管理系统

描述:
利用数据类构建用户信息系统,实现用户信息的打印、比较以及数据复制功能。

完整代码:

data class User(val id: Int, val name: String, val email: String)fun main() {// 创建用户对象val user1 = User(1, "Alice", "alice@example.com")val user2 = User(2, "Bob", "bob@example.com")val user3 = User(1, "Alice", "alice@example.com")// 打印用户信息println("用户1信息:$user1")println("用户2信息:$user2")// 比较用户对象println("用户1是否与用户3相等:${user1 == user3}")println("用户1是否与用户2相等:${user1 == user2}")// 使用 copy() 方法创建新对象val updatedUser = user1.copy(email = "newalice@example.com")println("更新后的用户信息:$updatedUser")
}

运行结果:

用户1信息:User(id=1, name=Alice, email=alice@example.com)  
用户2信息:User(id=2, name=Bob, email=bob@example.com)  
用户1是否与用户3相等:true  
用户1是否与用户2相等:false  
更新后的用户信息:User(id=1, name=Alice, email=newalice@example.com)  

总结

这三个案例分别展示了密封类、枚举类和数据类在 Kotlin 中的典型应用场景:

  • 密封类:状态管理,减少分支逻辑的复杂度;
  • 枚举类:常量值的管理,方便逻辑分类处理;
  • 数据类:轻松处理数据对象,提供便捷的方法如 copy()equals()

五、注意事项

  1. 数据类默认实现问题
    • 默认实现可能导致性能问题,应谨慎修改 hashCodeequals 方法。
  2. 密封类扩展性受限
    • 子类必须与密封类在同一个文件中,限制灵活性。
  3. 枚举类性能开销
    • 枚举类常量使用时会消耗较多内存,应根据场景选择。

六、特性

  • 数据类:简单高效,但不适合复杂逻辑建模。
  • 密封类:适合状态管理,但扩展性有限。
  • 枚举类:易用性强,但对内存要求较高。

七、性能评估

  • 数据类的内存占用较低,但频繁创建和销毁会有一定性能损耗。
  • 密封类在状态管理的性能表现优秀,但在大规模子类场景下会略显笨重。
  • 枚举类在管理常量方面性能可靠,但应避免过多常量值的定义。

八、总结与收获

数据类、密封类和枚举类是 Kotlin 的三大杀手锏。它们不仅提升了代码的可读性,还大幅度减少了开发的样板代码。无论是状态管理还是业务逻辑实现,都值得深度学习和应用。


欢迎关注 GongZhongHao:码农的乌托邦,程序员的精神家园!

相关文章:

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…...

我的AI工具箱Tauri+Django内容生产介绍和使用

在现代内容生产环境中,高效、自动化的工具能够显著提升生产力,降低人工成本。Tauri 与 Django 结合打造的工作箱,集成了强大的 音频处理、视频剪辑、内容下载 以及 AI 文章撰写 等模块,帮助用户在多媒体内容生产的各个环节实现高效…...

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

AJAX笔记入门篇

黑马程序员视频地址: 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…...

DOM操作中childNodes与children的差异及封装方案

引言 在JavaScript的DOM操作中,childNodes和children是开发者常用的属性,但它们在浏览器中的行为差异可能导致兼容性问题。尤其是在处理空白符(如换行符\n)时,某些浏览器(如Chrome和Edge)会将空…...

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.1项集(Itemset) 1.2规则(Rule) 1.3支持度(Support) 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…...

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...

使用QSqlQueryModel创建交替背景色的表格模型

class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role Qt.BackgroundRole…...

低代码产品插件功能一览

下图是统计的目前市面上流行的低代码、零代码产品的插件功能。 产品名称 产品类型 官方插件数量 支持拓展 官方插件功能 宜搭 零代码 3 暂不支持 云打印、CAD看图、打印表单详情 微搭 低代码 1 暂不支持 小程序 明道云 低代码 2 支持 视图、工作流节点 简道…...

buu-rip-好久不见26

简单的栈溢出,找到后面函数和输入的个数即可...

Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持

在去年春节,Flutter 官方发布了宏(Macros)编程的原型支持, 同年的 5 月份在 Google I/O 发布的 Dart 3.4 宣布了宏的实验性支持,但是对于 Dart 内部来说,从启动宏编程实验开始已经过去了几年,但…...

新手项目管理的实用工具推荐

项目启动的实用工具推荐 1. MindManager MindManager 是一款功能强大且广受欢迎的思维导图工具,对于项目启动阶段的新手而言,它就像是一位贴心的 “思路梳理助手”。在项目启动初期,各种信息和想法往往杂乱无章地充斥在脑海中,而…...

2025一区新风口:小波变换+KAN!速占!

今天给大家分享一个能让审稿人眼前一亮,好发一区的idea:小波变换KAN! 一方面:KAN刚中稿ICLR25,正是风口上,与小波变换的结合还处于起步阶段,正是红利期,创新空间广阔。 另一方面&a…...

Django ORM解决Oracle表多主键的问题

现状 以Django 3.2为例 Django ORM 设计为默认使用单一主键(通常是自增的 id 字段),这一选择主要基于以下核心原因: 简化ORM设计与操作 统一访问方式外键关联简化 避免歧义冲突 主键语义明确防止隐式依赖 性能与数据库兼容 索引…...

solidity高阶 -- 线性继承

Solidity是一种面向合约的高级编程语言,用于编写智能合约。在Solidity中,多线继承是一个强大的特性,允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承,并通过不同的实例展示其使用方法和注意事项。 在Sol…...

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...

系统思考—蝴蝶效应

“个体行为的微小差异,可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说,小变动带来大影响,这种现象,在复杂系统理论中被称为“蝴蝶效应”:即使极小的变化,也能在动态系…...

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客&#xff1a…...

sem_wait的概念和使用案列

sem_wait 是 POSIX 标准中定义的一个用于同步的函数,它通常用于操作信号量(semaphore)。信号量是一个整数变量,可以用来控制对共享资源的访问。在多线程编程中,sem_wait 常用于实现线程间的同步。 概念 sem_wait 的基…...

深度学习在金融风控中的应用:突破传统模型的瓶颈

深度学习在金融风控中的应用:突破传统模型的瓶颈 金融风险控制(简称“风控”)是现代金融体系中至关重要的一环,关系到金融机构的稳定性、客户的安全以及整体经济的健康运行。近年来,随着深度学习的迅猛发展,传统的风控模型正面临被颠覆的挑战,新的技术手段和思维方式正…...

【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址,指向另一个数据。 Rust 中最常见的指针是引用&#xff0c…...

Spring AI 在微服务中的应用:支持分布式 AI 推理

1. 引言 在现代企业中,微服务架构 已成为开发复杂系统的主流方式,而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI,使多个服务可以协同完成 AI 任务,并支持分布式 AI 推理&#x…...

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::...

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析 0 预览一 该文件功能`fsm_reboot.c` 文件功能函数预览二 函数功能介绍`fsm_reboot.c` 中主要函数的作用1. `ec_fsm_reboot_init`2. `ec_fsm_reboot_clear`3. `ec_fsm_reboot_single`4. `ec_fsm_reboot_all`5. `ec_fsm_reb…...

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…...

深入理解Linux内核的虚拟地址到物理地址转换机制及缓存优化

在现代计算机系统中,虚拟地址到物理地址的转换是操作系统内存管理的重要组成部分。特别是在基于x86_64架构的Linux系统上,这一转换过程及其相关的缓存机制对系统性能和稳定性至关重要。本文将深入探讨Debian 10上运行Linux 4.19内核时,这些机制的实现细节,特别是页表管理、…...

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破:从零开始的推理能力进化DeepSeek R1-Zero:纯RL训练的“自我觉醒”DeepSeek R1:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…...

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…...

php接口连接数据库

框架:https://www.thinkphp.cn/doc 创建网站 域名自己写 创建文件夹,“test”拉取框架,地址栏输入 composer create-project topthink/think5.1.* tp5 会自动创建一个tp5文件夹 根目录选择刚刚创建拉框架的文件夹 以test为示例 “D:\test\…...