Kotlin的data class

在 Kotlin 中,data class 是一种专门用来存储数据的类。与普通类相比,data class 提供了简化数据存储的语法,并且自动生成了一些常用的方法,例如 toString()equals()hashCode()copy()

1. 定义 data class

data class 的定义非常简单,只需要在 class 前加上 data 关键字即可:

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

2. data class 的自动生成功能

使用 data class,Kotlin 自动为你生成以下功能:

  • toString(): 用于友好地输出对象的字符串表示。
  • equals()hashCode(): 用于对象比较(基于内容,而不是引用)。
  • copy(): 用于创建对象的副本,可以选择修改部分属性。
  • componentN(): 按属性顺序为每个属性生成 componentN() 方法,支持解构声明。
示例
data class Person(val name: String, val age: Int)fun main() {val person1 = Person("Alice", 25)// 自动生成的 toString()println(person1)  // 输出: Person(name=Alice, age=25)// 自动生成的 equals()val person2 = Person("Alice", 25)println(person1 == person2)  // 输出: true// 自动生成的 copy()val person3 = person1.copy(age = 30)println(person3)  // 输出: Person(name=Alice, age=30)// 自动生成的 componentN()val (name, age) = person1println("Name: $name, Age: $age")  // 输出: Name: Alice, Age: 25
}

3. data class 的限制

  • 主构造函数必须至少有一个参数

    data class Empty() // 报错:必须至少包含一个参数
    
  • 主构造函数的参数必须是 valvar

    data class InvalidDataClass(name: String) // 报错:name 不是 val 或 var
    
  • data class 不能是抽象类、密封类或内部类

    abstract data class AbstractDataClass(val id: Int) // 报错
    

4. copy() 方法

copy() 方法是 data class 的一个重要特性。它允许你复制一个对象,并根据需要修改部分属性,而无需手动创建新对象。

示例
data class Product(val name: String, val price: Double, val stock: Int)fun main() {val originalProduct = Product("Laptop", 999.99, 50)val updatedProduct = originalProduct.copy(price = 899.99, stock = 30)println(originalProduct)  // 输出: Product(name=Laptop, price=999.99, stock=50)println(updatedProduct)   // 输出: Product(name=Laptop, price=899.99, stock=30)
}

5. 解构声明

通过 componentN() 方法,data class 的属性可以直接解构为多个变量。

示例
data class Point(val x: Int, val y: Int)fun main() {val point = Point(10, 20)val (x, y) = pointprintln("x: $x, y: $y")  // 输出: x: 10, y: 20
}

6. 嵌套 data class

data class 可以嵌套在另一个类中,用于更复杂的数据结构。

示例
data class Address(val city: String, val street: String)
data class User(val name: String, val address: Address)fun main() {val user = User("Alice", Address("New York", "5th Avenue"))println(user)  // 输出: User(name=Alice, address=Address(city=New York, street=5th Avenue))
}

7. hashCode()equals()

data class 自动生成基于内容的 equals()hashCode() 方法,适合用于对象比较和哈希集合。

示例
data class Item(val id: Int, val name: String)fun main() {val item1 = Item(1, "Pen")val item2 = Item(1, "Pen")val itemSet = setOf(item1, item2)println(item1 == item2)  // 输出: trueprintln(itemSet.size)    // 输出: 1
}

8. data class 表格分析

特性功能
toString()返回类的字符串表示(属性及其值)。
equals()基于内容的相等性判断。
hashCode()基于属性值生成哈希值,适用于哈希集合(如 HashSetHashMap)。
copy()创建对象副本,并允许修改部分属性值。
componentN()支持解构声明,将对象属性解构为独立的变量。
嵌套可以嵌套使用,用于创建复杂的嵌套数据结构。

9. 适用场景

  • 数据存储data class 非常适合表示数据结构(如模型类、DTO、VO 等)。
  • 集合操作:配合 mapfilter 等集合函数使用。
  • 解构操作:轻松解构数据到多个变量。
  • 对象比较:需要基于内容而非引用的比较时非常方便。

通过 data class,Kotlin 提供了一种高效、简洁的方式来管理和操作数据结构。

10. 注意事项

  • 主构造函数的参数会自动作为 val 或 var 属性,且只能是这些属性会参与生成的默认方法。
  • data class 不支持继承(它们默认是 final 的)。
  • 可以自定义方法,但需注意保持数据对象的纯粹性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转: 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…

教程 - 在 Creo Elements/Pro 中使用 Mechanica 分析杆的 von-mises 应力?

这是教程。 步骤1: 在“零件”模式下启动 Creo Elements/Pro。 步骤2: 草绘>>顶平面并绘制一个直径为 20mm 的圆。 步骤3: 将其挤出 200 毫米。 步骤4: 应用>>机械. 步骤5: 单击“确定”&…

PBDL (基于物理的深度学习)-Chapter 1

0 介绍 本书名为 Physics-Based Deep Learning (基于物理的深度学习),意指将物理建模和数值模拟与基于人工神经网络的方法相结合。基于物理的深度学习的大方向代表了一个非常活跃、快速发展和令人兴奋的研究领域。 来源书籍: A Teaser Example — Physics-based Deep Learnin…

【HarmonyOS Next】鸿蒙实用装饰器一览(一)

装饰器是现代js一个很重要(尚未成熟)的特性,TS4.9开始对装饰器的Stage 3支持,并在TS5.0中发布了装饰器规范的完整版本。ArkTS在TS生态基础上做了进一步扩展,保持了TS的基本风格,同时封装了大量的装饰器来简化功能。 以下内容基于…

ssm框架-spring-spring声明式事务

声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作! 使用声明式事务可以将事务的控制和业务逻辑分离开来,提…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构&#xff0c;用于表示节点&#xff08;顶点&#xff09;之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的&#xff08;边有方向&#xff09;或无向的&#xff08;边没有方向&#xff09;&#xff0c;可以是加权的&#xff…

Flink入门介绍

《 Flink 入门介绍》 一、前言 在当今大数据领域&#xff0c;流式计算扮演着至关重要的角色。它与传统的批量计算有着明显的区别&#xff0c;并在众多场景中展现出独特的优势。 &#xff08;一&#xff09;数据的时效性 在日常工作中&#xff0c;数据处理方式多样。若处理年…

短剧系统小程序开发产品设计实例解析

短剧系统小程序开发架构深度解析引言 随着数字娱乐市场的蓬勃发展&#xff0c;短剧因其紧凑的情节、创新的表现形式和便捷的观看体验&#xff0c;迅速吸引了大量观众的关注。作为承载短剧内容的重要平台&#xff0c;短剧系统小程序不仅需要在用户体验、内容管理等方面做到极致&…

AI数字人视频小程序:引领未来互动新潮流

当下&#xff0c;随着人工智能技术的不断创新发展&#xff0c;各类AI系统已经成为了创新市场发展的重要力量&#xff0c;AI文案、AI数字人、AI视频等&#xff0c;为大众带来更加便捷的创作方式&#xff0c;AI成为了一个全新的风口&#xff0c;各种AI红利持续释放&#xff0c;市…

《光谱学与光谱分析》

《光谱学与光谱分析》(Spectroscopy and Spectral Analysis)系中国科学技术协会主管&#xff0c;中国光学学会主办&#xff0c;由钢铁研究总院、中国科学院物理研究所、北京大学、清华大学联合承办的学术性刊物。刊登主要内容&#xff1a;激光光谱测量、红外、拉曼、紫外、可见…

解决vue-pdf的签章不显示问题

在使用vue-pdf 4.3.0时发现上传一般的普通pdf正常预览&#xff0c;但是上传带有红头文件的和和特殊字体的pdf无法正常内容显示&#xff0c;文字丢失问题。 1、查看控制台报错信息 2、缺少字体原因 getNumPages(url) {var loadingTask pdf.createLoadingTask({url: url,//引入…

【 模型】 开源图像模型Stable Diffusion入门手册

开源图像模型Stable Diffusion入门手册 引言硬件要求环境部署手动部署整合包 模型装配更新显存优化插件配置文生图最简流程提示词使用技巧结语 引言 Stable Diffusion是一款在2022年发布的深度学习文字到图像生成模型。它能够根据文字描述生成详细的图像&#xff0c;并且在几秒…

跨境电商API接口:数据采集与业务集成的核心

跨境电商作为全球贸易的重要组成部分&#xff0c;正随着互联网技术的发展而迅速增长。在这个过程中&#xff0c;API接口扮演了至关重要的角色&#xff0c;它们不仅提高了运营效率&#xff0c;还增强了安全性和用户体验。本文将深入探讨跨境电商API接口的应用、重要性以及面临的…

【linux013】文件操作命令篇 - less 命令

文章目录 less 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 less 命令 less 是 Linux 中强大的文件分页查看命令&#xff0c;比 more 更灵活且功能更强大。less 支持双向滚动、搜索、显示大文件等功能&#xff0c;适用于查看文件内容或管道输出的大量文本…

力扣 无重复字符的最长字串-3

无重复字符的最长字串-3 class Solution { public:// 解决方法&#xff1a;双指针int lengthOfLongestSubstring(string s) { // 如果字符串为空&#xff0c;直接返回0if (s.length() 0)return 0;// 如果字符串不为空&#xff0c;字符串每个字符都不同的情况下&#xff0c;最…

如何在Ubuntu当中利用CloudCompare软件进行点云配准拼接?

1.首先需要安装相应的cloudcompare软件&#xff0c;以下有两种方式&#xff1a;第一种直接在ubuntu的软件商店里搜索CloudCompare软件进行install&#xff0c;我这里已经安装完毕。 方式二&#xff1a;可以直接原码安装&#xff1a; github地址&#xff1a; https://github.co…

贴贴,一款windows剪切板管理软件

贴贴&#xff0c;一款windows剪切板管理软件 软件下载官网 https://tietieapp.com 软件界面 软件界面简洁、信息展示清晰。软件会自动记录你复制过的内容。包括哪个软件复制的、复制的时间。支持图片、文本、文件等多种格式。支持持久化&#xff0c;电脑重启记录仍然存在。支持…