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) = person1
    println("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) = point

    println("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)  // 输出: true
    println(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 的)。
  • 可以自定义方法,但需注意保持数据对象的纯粹性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome 浏览器 131 版本开发者工具(DevTools)更新内容

Chrome 浏览器 131 版本开发者工具(DevTools)更新内容 一、使用 Gemini 调试 CSS Chrome DevTools 现在推出了一个新的实验性 AI 辅助面板,可以与 Gemini 聊天并获得帮助来调试 CSS。 在 Elements 面板中,右键点击一个元素并选…

网络编程-002-UDP通信

1.UDP通信的简单介绍 1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高 1.2 包大小有限制,不发大于路径MTU的数据包 1.3容易丢包 1.4 可以实现一对多,多对多 2.客户端与服务端=发送端与接收端 代码框架 收数据方一般都是客户端/接收端 3.头文件 #i…

websocket身份验证

websocket身份验证 前言 上一集我们就完成了websocket初始化的任务,那么我们完成这个内容之后就应该完成一个任务,当客户端与服务端连接成功之后,客户端应该主动发起一个身份认证的消息。 身份认证proto 我们看一眼proto文件的内容。 我…

初识C++(1)

C是在C语言的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库以及编程范式等。 在C语言中&#xff0c;变量、函数和类的名称存在于全局作用域中&#xff0c;因此可能会发生许多冲突。比如&#xff1a; #include<stdio.h> #include<…

Axure9生成的阅览页面如何自动展开左侧页面导航?

问题 Axure9生成的阅览页面&#xff0c;默认情况是自动折叠的&#xff0c;如何自动展开左侧页面导航&#xff1f; 解决 Axure工具&#xff1a;发布 > 预览选项 > 播放器 > 打开页面列表

LeetCode:700. 二叉搜索树中的搜索

目录 题目描述: 代码: 题目描述: 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3…

架构图解析:如何构建高效的微服务系统

在当今的数字化浪潮中&#xff0c;构建高效、灵活且可扩展的系统已成为企业的重要目标。微服务架构作为一种先进的软件设计模式&#xff0c;通过将复杂的应用程序分解为一系列小型、独立的服务&#xff0c;显著提升了系统的灵活性、可扩展性和维护性。本文将通过解析微服务系统…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…

【海思Hi3519DV500】双目网络相机套板硬件规划方案

Hi3519DV500双目网络相机套板是针对该芯片设计的一款 IP 编码板 PCBA&#xff0c;硬件接口支持双目sensor 接入&#xff0c;SDIO3.0 接口、USB2.0、USB3.0、UART 接口以及丰富的 IO 扩展应用&#xff0c;可根据各种使用场景设计相应扩展板&#xff0c;丰富外围接口&#xff0c;…

百度世界2024:智能体引领AI应用新纪元

在近日盛大举行的百度世界2024大会上&#xff0c;百度创始人李彦宏以一场题为“文心一言”的精彩演讲&#xff0c;再次将全球科技界的目光聚焦于人工智能&#xff08;AI&#xff09;的无限可能。作为一名科技自媒体&#xff0c;我深感这场演讲不仅是对百度AI技术实力的一次全面…

SPP:空间金字塔池化

今天水一篇博客&#xff0c;讲讲SPP池化结构&#xff1b;那这是个什么东西呢&#xff1f;它的作用又是什么呢&#xff1f;在了解它之前我们先简单了解一下大部分的神经网络&#xff1b; 引入&#xff1a; 在大部分的神经网络中&#xff0c;都将神经网络分为Backbone主干网络、…

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要&#xff0c;可以通过以下步骤来实现使用 root 登录&#xff1a; 1、设置 root 密码 打开终端&#xff0c;使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…

ubuntu下连接了192.168.1.x和192.168.2.x两个网络段,如何让这个两个网段互相通信?

在 Ubuntu 上连接两个网络段&#xff08;如 个人终端A 192.168.1.10 和 个人终端B 192.168.2.10&#xff09;&#xff0c;需要配置路由和网络转发功能&#xff0c;使这两个网段能够相互通信。以下是实现方法&#xff1a; 步骤 1&#xff1a;确认网络配置 1. 确保 Ubuntu 机器…

React Native Mac 环境搭建

下载 Mac 版Android Studio 下载 安装 JDK 环境 Flutter 项目实战-环境变量配置一 安装 Node.js 方式一 通过Node.js 官网下载 下载完成后点击安装包进行安装 安装完成

第75期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

vue2-基础核心

vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式&#xff0c;提高代码复用率&#xff0c;让代码更好维护 声明式编码&#xff0c;无需直接操作DOM&#xff0c;提高开发效率&#xff0c;编码简洁、体积小&#xff0c;运行效率高 本…

移动应用开发:使用Android Studio 实现登录页与注册页跳转

文章目录 前期一&#xff0c;添加UI控件触发跳转二&#xff0c;编写LoginActivity活动代码三&#xff0c;运行程序查看效果 前期 需创建两个活动页面&#xff0c;登录页和注册页&#xff0c;可参考&#xff1a;《Android Studio实现简易登录页》《Android Studio实现简易注册页…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

ssm143校园一卡通系统软件的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;校园一卡通系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园一卡通系统就是…

[Go]-sync.map使用详解

sync.Map是 Go 语言中在并发环境下使用的安全映射类型。 一、为什么需要sync.Map 在 Go 语言中&#xff0c;普通的map不是并发安全的。当多个 goroutine 同时读写一个普通map时&#xff0c;可能会导致程序出现未定义的行为&#xff0c;比如数据竞争、程序崩溃等。而sync.Map则…