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

kotlin 数据类

一 kotlin数据类与java普通类区别

Kotlin 的 data class 与 Java 中的普通类(POJO)相比,确实大大减少了样板代码(boilerplate),但它的优势不止于自动生成 getter/setter、copy()equals()toString(),还有更深层的设计理念。


✅ Kotlin data class 相比 Java 普通类的优势总结:

功能Kotlin data classJava 普通类
自动 getter/setter✅ 有(默认 val/var)❌ 手动写或用 IDE 自动生成
自动 equals() / hashCode()✅ 有(按值比较)❌ 手动写或生成
自动 toString()✅ 有,输出结构化字段❌ 手动写或生成
自动 copy()✅ 有,支持字段修改复制❌ 没有(需手动实现 clone 或构造新对象)
自动 componentN()✅ 有,支持解构声明❌ 无此功能
不可变性(推荐)✅ 默认使用 val❌ 通常是可变字段
构造函数简洁性✅ 仅需一行❌ 要手动写构造函数、字段定义等

📌 Kotlin data class 的核心优势不仅是“帮写代码”,而是:

1. 表达数据建模意图更清晰

data class User(val id: Int, val name: String)
  • 一行就定义了一个完整的、有值语义的对象。
  • 对于“只是用于存储数据”的类,data class 就是最好的选择。

2. 值语义(value semantics)

  • equals() 是按“字段值”比较,而非 Java 默认的“引用地址比较”。
  • 更符合业务需求:两个字段完全一致的对象视为“相等”。

3. 数据不可变性(val) + copy()

val user1 = User(1, "Tom")
val user2 = user1.copy(name = "Jerry")  // 轻松创建新对象
  • copy() 可以修改指定字段,其它字段保持不变,极其适合不可变状态模型(例如 MVI 架构)。

4. 解构语法支持

val (id, name) = user
  • 背后调用的是 component1()component2() 等,写法简洁,语义清晰。
  • 非常适合与集合操作、map 等函数式编程配合使用。

5. 与 Kotlin 的其他语言特性深度整合

  • data class 很容易用于 sealed classwhen 表达式、copy+with 模式。
  • 支持 Parcelable(用插件可自动实现)
  • 可轻松用于序列化(如 Gson、Kotlinx.serialization)

❌ Java 普通类的典型问题:

public class User {private int id;private String name;public User(int id, String name) { ... }public int getId() { ... }public void setId(int id) { ... }public String getName() { ... }public void setName(String name) { ... }@Overridepublic boolean equals(Object o) { ... }@Overridepublic int hashCode() { ... }@Overridepublic String toString() { ... }
}
  • 十几行冗长代码,表达的其实就是两个字段的封装。
  • IDE 可以帮生成,但还是啰嗦、维护难、容易出错。

✅ 总结一句话:

Kotlin 的 data class针对“仅用于保存数据”的类量身定制的语法糖,不仅提高了代码简洁性,更鼓励不可变设计和函数式思维,显著提升代码质量与可维护性。


二 示例

好的!下面是一个完整的 Java 普通类 vs Kotlin data class 的对比示例,展示在表达同一个数据结构时,两者在语法和功能上的区别:


🟫 Java:普通类 User

public class User {private int id;private String name;public User(int id, String name) {this.id = id;this.name = name;}public int getId() { return id; }public void setId(int id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof User)) return false;User user = (User) o;return id == user.id && name.equals(user.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}@Overridepublic String toString() {return "User{id=" + id + ", name='" + name + "'}";}
}

✅ 功能完整,但写起来冗长、重复。


🟩 Kotlin:使用 data class

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

✅ 一行搞定,具备:

  • equals()hashCode()toString()
  • copy():创建带修改的新对象
  • 解构:val (id, name) = user

🔍 Kotlin 使用场景示例:

val user1 = User(1, "Tom")val user2 = user1.copy(name = "Jerry")
// user1 仍然是原值,user2 仅 name 不同val (id, name) = user2
println("ID=$id, NAME=$name")// 输出:ID=1, NAME=Jerry

✅ 对比总结:

功能Java 普通类Kotlin data class
代码行数多(>40 行)极少(通常 1 行)
自动 equals()❌ 需手动重写✅ 自动按值生成
自动 toString()❌ 需手动重写✅ 有结构化输出
自动 copy()❌ 无(需手动构造)✅ 一行复制并修改字段
解构支持❌ 无(val1, val2) = obj
默认不可变性❌ 默认可变字段✅ 推荐 val,可读性强

如果在编写用于状态管理、数据传输、JSON 结构建模、列表项展示等数据结构,Kotlin 的 data class 是首选。

相关文章:

kotlin 数据类

一 kotlin数据类与java普通类区别 Kotlin 的 data class 与 Java 中的普通类(POJO)相比,确实大大减少了样板代码(boilerplate),但它的优势不止于自动生成 getter/setter、copy()、equals()、toString()&am…...

豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

目录 引言:当豆瓣榜单遇见大数据技术 项目文档 1.1 选题背景 1.2 项目目标 2. 项目概述 2.1 系统架构设计 2.2 技术选型 2.3 项目环境搭建 2.3.1 基础环境准备 2.3.2 爬虫环境配置 2.3.3 Docker安装ES连接Kibana 安装IK插件 2.3.4 vscode依赖服务安装 3. 核心模…...

把Excel数据文件导入到Oracle数据库

数据管理和分析的领域,将Excel中的数据导入到Oracle数据库是一个常见的需求,无论是为了利用Oracle强大的数据处理能力,还是为了实现数据的集中存储和管理,这一过程都需要一定的步骤和技巧,本文将详细介绍如何从Excel导…...

PyTorch API 6 - 编译、fft、fx、函数转换、调试、符号追踪

文章目录 torch.compiler延伸阅读 torch.fft快速傅里叶变换辅助函数 torch.func什么是可组合的函数变换?为什么需要可组合的函数变换?延伸阅读 torch.futurestorch.fx概述编写转换函数图结构快速入门图操作直接操作计算图使用 replace_pattern() 进行子图…...

Dagster Pipes系列-1:调用外部Python脚本

本文是"Dagster Pipes教程"的第一部分,介绍如何通过Dagster资产调用外部Python脚本并集成到数据管道中。首先,创建Dagster资产subprocess_asset,利用PipesSubprocessClient资源执行外部脚本external_code.py,实现跨进程…...

python shutil 指定文件夹打包文件为 zip 压缩包

python shutil 指定文件夹打包文件为 zip 压缩包,具体代码如下: import shutil# 指定要打包的文件夹路径 src_doc ./test# 指定输出的压缩包文件名(不包含扩展名) output_filename testfromat_ zip# 打包并压缩文件夹为 ZIP …...

Webug4.0通关笔记25- 第30关SSRF

目录 一、SSRF简介 1.SSRF原理 2.渗透方法 二、第30关SSRF渗透实战 1.打开靶场 2.渗透实战 (1)Windows靶场修复 (2)Docker靶场修复 (3)获取敏感文件信息 (4)内网端口与服务…...

Android学习总结之线程池篇

一、线程池参数调优实战真题 真题 1:直播 APP 弹幕加载线程池设计 题目描述:直播 APP 需要实时加载弹幕数据(网络请求,IO 密集型),同时渲染弹幕视图(UI 操作需切主线程)&#xff0…...

OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorLSBP

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::bgsegm::BackgroundSubtractorLSBP 是 OpenCV 中用于背景分割的一个类,它基于局部样本二进制模式(Local Sample Bina…...

MacOS 上构建 gem5

MacOS 中只存在 python3,但是scons 只认 python,不在 系统中创建 软连接,一个是因为比较难操作;另一个是尽量不要更改系统。所以独立构件python 和scons: 1,安装python 下载源代码: Python S…...

认识中间件-以及两个简单的示例

认识中间件-以及两个简单的示例 什么是中间件一个响应处理中间件老朋友 nest g如何使用为某个module引入全局引入编写逻辑一个日志中间件nest g mi 生成引入思考代码进度什么是中间件 官方文档 中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及…...

(五)毛子整洁架构(分布式日志/Redis缓存/OutBox Pattern)

文章目录 项目地址一、结构化日志1.1 使用Serilog1. 安装所需要的包2. 注册服务和配置3. 安装Seq服务 1.2 添加分布式id中间件1. 添加中间件2. 注册服务3. 修改Application的LoggingBehavior 二、Redis缓存2.1 添加缓存1. 创建接口ICaching接口2. 实现ICaching接口3. 注册Cachi…...

SQL:MySQL函数:字符串函数

目录 为什么需要字符串函数? 1️⃣ LENGTH(str) — 这个字符串有几个“字节”? 2️⃣ CHAR_LENGTH(str) — 这个字符串有几个“字符”? 3️⃣ TRIM(str) — 把两边的空格剪掉 4️⃣ REPLACE(str, a, b) — 把 a 替换成 b 使用这些函数时…...

DAY04:Vue.js 指令与事件处理深度解析之从基础到实战

1. 指令系统核心概念 1.1 插值表达式与基础指令 Vue.js 的指令系统是其响应式编程模型的核心&#xff0c;我们首先从最基础的插值表达式开始&#xff1a; <div id"app"><!-- 基础文本插值 --><p>{{ message }}</p><!-- JavaScript 表达…...

大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比

文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调&#xff08;Fine-tun…...

云效 MCP Server:AI 驱动的研发协作新范式

作者&#xff1a;黄博文、李晔彬 云效 MCP Server 是什么&#xff1f; 云效 MCP&#xff08;Model Context Protocol&#xff09;是阿里云云效平台推出的模型上下文协议标准化接口系统&#xff0c;作为连接 AI 助手与 DevOps 平台的核心桥梁&#xff0c;通过模型上下文协议将…...

Linux常见指令解析(三)

通配符 * *可以匹配任意名称的文件&#xff0c;如&#xff1a; ls * 列出当前目录下的所有非隐藏文件和目录&#xff0c;并展开目录内容 ls *.c 列出当前目录下以.c为结尾的文件 rm -rf * 删除所有非隐藏文件 alias指令 alias指令用于给命令取别名。如&#xff1a; 给ls …...

消息队列如何保证消息可靠性(kafka以及RabbitMQ)

目录 RabbitMQ保证消息可靠性 生产者丢失消息 MQ丢失消息 消费端丢失了数据 Kakfa的消息可靠性 生产者的消息可靠性 Kakfa的消息可靠性 消费者的消息可靠性 RabbitMQ保证消息可靠性 生产者丢失消息 1.事务消息保证 生产者在发送消息之前&#xff0c;开启事务消息随后生…...

HTTP学习

HTTP知识 01. 经典五层模型 应用层 为应用软件提供了很多服务&#xff0c;构建于协议之上。 传输层 数据的传输都是在这层定义的&#xff0c;数据过大分包&#xff0c;分片。 网络层 为数据在节点之间传输创建逻辑链路 数据链路层 通讯实体间建立数据链路连接 物理层 主要作用…...

go语言实现IP归属地查询

效果: 实现代码main.go package mainimport ("encoding/json""fmt""io/ioutil""net/http""os" )type AreaData struct {Continent string json:"continent"Country string json:"country"ZipCode …...

一站式解决技术平台访问难题:合规优化方案助力高效开发(2025 最新)

摘要 在技术开发与协作中&#xff0c;GitHub 等国际平台的访问效率及国内社区的使用体验常受网络环境影响。本文严格遵循网络安全规范&#xff0c;聚焦本地化 DNS 优化、官方镜像加速、浏览器工具提效等合规技术&#xff0c;提供覆盖国内外技术平台的访问优化方案&#xff0c;…...

Android RxJava框架分析:它的执行流程是如何的?它的线程是如何切换的?如何自定义RxJava操作符?

目录 RxJava是什么&#xff1f;为什么使用。RxJava是如何使用的呢&#xff1f;RxJava如何和Retrofit一起使用。RxJava源码分析。 &#xff08;1&#xff09;他执行流程是如何的。&#xff08;2&#xff09;map&#xff08;3&#xff09;线程的切换。 如何自定义RxJava操作符…...

MySQL及线程关于锁的面试题

目录 1.了解过 MySQL 死锁问题吗&#xff1f; 2.什么是线程死锁&#xff1f;死锁相关面试题 2.1 什么是死锁&#xff1a; 2.2 形成死锁的四个必要条件是什么&#xff1f; 2.3 如何避免线程死锁&#xff1f; 3. MySQL 怎么排查死锁问题&#xff1f; 4.Java线上死锁问题如…...

前端vue+elementplus实现上传通用组件

上传组件&#xff1a; <template><div class"upload-file"><el-uploadmultiple:action"uploadFileUrl":before-upload"handleBeforeUpload":file-list"fileList":limit"limit":on-error"handleUploadE…...

联合类型的逻辑或关系与类型保护

在 TypeScript 中&#xff0c;联合类型&#xff08;Union Types&#xff09;是一种强大的类型工具&#xff0c;它允许一个变量可以是几种不同类型中的一种。联合类型通过逻辑“或”关系&#xff08;|&#xff09;连接多个类型。这种类型的灵活性使得我们能够处理多样化的数据输…...

spring boot3.0自定义校验注解:文章状态校验示例

文章目录 Spring Boot 自定义校验注解&#xff1a;状态校验示例一、创建 State 注解步骤&#xff1a;1. 创建自定义注解&#xff1a;2. 实现校验逻辑&#xff1a; 二、 实现自定义校验步骤:1. 在实体类中使用自定义校验注解 State&#xff1a;2. 添加 State 注解&#xff1a; 总…...

神经网络是如何工作的

人工智能最核心的技术之一&#xff0c;就是神经网络&#xff08;Neural Networks&#xff09;。但很多初学者会觉得它是个黑盒&#xff1a;为什么神经网络能识别图片、翻译语言&#xff0c;甚至生成文章&#xff1f; 本文用图解最小代码实现的方式&#xff0c;带你深入理解&am…...

【工作记录】crmeb后端项目打开、运行

1、下载代码 1&#xff09;安装git 不再详述 2&#xff09;git拉代码 项目地址如下&#xff0c;在vscode-分支中拉代码 # 克隆项目 git clone https://gitee.com/ZhongBangKeJi/crmeb_java/ 截图如下是已经成功拉下来 注意安装对应版本 2、maven配置 安装配置见&#x…...

智能手表测试计划文档(软/硬件)

&#x1f4c4; 智能手表测试计划文档&#xff08;软/硬件&#xff09; 项目名称&#xff1a;Aurora Watch S1 文档编号&#xff1a;AW-S1-QA-TP-001 编制日期&#xff1a;2025-xx-xx 版本&#xff1a;V1.0 编写人&#xff1a;xxx&#xff08;测试主管&#xff09; 一、测试目标…...

DeepSeek:开启能源领域智能化变革新时代

目录 一、DeepSeek 与能源领域变革的邂逅1.1 DeepSeek 在人工智能领域的地位与特点1.2 能源行业面临的挑战与变革需求1.3 DeepSeek 在能源领域应用的重要性和意义 二、能源政策解读与科普新助手2.1 能源政策解读的深度变革2.2 能源科普的创新使者 三、能源项目可行性分析新利器…...