Java 中的记录与类

java 中的记录与类

如果您已经了解 java 中的记录,您可能会发现它的用法与类非常相似,但必须考虑到一些重要的差异。在本文中,我们将了解 java 中记录之间的差异。如果您仍然不知道记录,我建议阅读我的文章《java 中的记录:它们是什么以及如何使用它们》。

不变性

不可变对象是指一旦创建对象,其属性就无法修改的对象。对于 records 来说,它们是不可变的,也就是说,一旦创建 record 类型的对象,其属性就无法修改。另一方面,类可能是不变的,也可能不是不变的,具体取决于它的实现方式。这部分确保数据的完整性并防止其被意外修改。

目的

类通常只是为了存储数据而编写,例如来自数据库查询的数据或来自表单的数据。在许多情况下,该数据是不可变的,因为需要在不使用同步的情况下确保数据的有效性。为了实现这一点,使用以下元素编写一个类:

每个字段的私有属性。每个字段的获取器。初始化所有字段的构造函数。比较对象是否相等的 equals 方法。hashcode 方法,根据字段生成哈希码。一个 tostring 方法,用于生成字段的字符串表示形式。

例如,如果你有一个 person 类,有两个属性 name 和 lastname,你可以这样写:

public class person {    private final string name;    private final string lastname;    public person(string name, string lastname) {        this.name = name;        this.lastname = lastname;    }    public string getname() {        return name;    }    public string getlastname() {        return lastname;    }    @override    public string tostring() {        return "person{" + "name='" + name + ''' +                ", lastname='" + lastname + ''' +                '}';    }    @override    public boolean equals(object o) {        if (this == o) return true;        if (!(o instanceof person person)) return false;        return objects.equals(getname(), person.getname()) && objects.equals(getlastname(), person.getlastname());    }    @override    public int hashcode() {        return objects.hash(getname(), getlastname());    }}

这是该任务的解决方案,但它是实际需要的大量代码。如果类具有更多属性,即使在 ide 或 github copilot 等插件的帮助下完成,编写的代码也会更长。更好的解决方案是将我们的类声明为数据类,即仅存储数据的类,并且不必具有特定行为,这就是 records 的用武之地。

立即学习“Java免费学习笔记(深入)”;

这样,person 类就可以重写为记录,如下所示:

Ai好记 Ai好记

强大的AI音视频转录与总结工具

Ai好记 311 查看详情 Ai好记

public record person(string name, string lastname) { }

这会自动生成 equals、hashcode 和 tostring 方法,以及每个属性的 getter 方法。

记录和类之间有什么区别

不可变性记录是不可变的,也就是说,记录类型的对象一旦创建,其属性就无法修改。相反,类可能是不变的,也可能不是不变的,具体取决于它的实现方式。生成方法记录自动生成equals、hashcode和tostring方法,以及每个属性的getter方法。另一方面,在类中,这些方法必须手动实现或借助 ide 实现。在oop中使用记录不能从其他类继承,也不能被其他类扩展,但它们可以实现接口。另一方面,类可以从其他类继承、扩展,并且通常非常适合涵盖面向对象编程的概念。语法记录的语法比类更简单,因为它可以在一行中定义,而类需要多行代码。用途记录是一种类似于dto(数据传输对象)的结构,即帮助建模不可变数据的类,其一部分是 是一个更通用的结构,可以有行为和状态。

何时使用记录,何时使用类?

如果需要的是一个不可变的数据结构来存储数据,并且不需要对属性进行任何修改(简单地看成是一个承载信息的对象)。另一方面,如果您需要具有独特逻辑和特定方法的更通用的结构、面向对象范例的方法、应用设计模式或使用 jpa 或 hibernate 等,那么您应该使用类。

额外:具有可变属性的记录

让我们考虑以下示例,有两条记录 product,其属性为名称和价格,还有一个 cart,其具有 arraylist 类型的单个属性 products 以及一些获取产品数量和购物车总数的方法。

package org.jordi.example;public record product(string name, double price) { }
package org.jordi.example;import java.util.arraylist;import java.util.list;public record cart(list products) {    public cart() {        this(new arraylist());    }    public int getquantity() {        return this.products.size();    }    public double gettotal() {        return this.products.stream().maptodouble(product::price).sum();    }}

本例中的问题是,每个 记录 本身都是不可变的,但在记录 cart 的情况下,具有 arraylist 类型的属性,并且由于 arraylist 本质上是可变的,一旦记录购物车实例化,就可以修改列表的内容。

package org.jordi.example;public class Main {    public static void main(String[] args) {        Product water = new Product("Water", 15);        Product milk = new Product("Milk", 22);        Cart cart = new Cart();        cart.products().add(water);        cart.products().add(milk);        System.out.println("Price: " + cart.getTotal());        cart.products().clear();        System.out.println("Quantity: " + cart.getQuantity());        System.out.println("Price: " + cart.getTotal());    }}

上面的代码编译没有问题,因为只修改了列表的内容,但产品属性本身没有被修改。这只是特定情况的示例,可能没有必要,但很高兴知道这是可以做到的。

以上就是Java 中的记录与类的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/452599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何对vmware虚拟机中的Linux系统进行扩容并将扩大的空间应用在linux中
上一篇 2025年11月8日 00:01:04
桃源记2地图资源怎么找-桃源记2地图资源点位及商人点位一览
下一篇 2025年11月8日 00:01:07

相关推荐

  • Java方法重载和重写核心概念

    方法重载发生在同一类中,方法名相同但参数列表不同,与返回类型无关;方法重写发生在子类继承父类时,方法名、参数列表和返回类型必须相同,访问权限不能更严格,且不能重写private、static或final方法。重载实现编译时多态,重写实现运行时多态。 方法重载和重写是Java中实现多态的两种重要机制,…

    2026年9月8日
    000
  • 抖音笔记怎么发图片?怎么用笔记发图片

    如今在抖音这个以短视频为主的平台上,越来越多用户开始通过“笔记”功能分享自己的生活感悟、实用技巧和心得体会。作为一种更注重图文表达的内容形式,笔记让用户能更自由地传递信息。而图片作为视觉传达的核心元素,自然成为提升笔记吸引力的关键。那么,抖音笔记怎么发图片?又该如何高效利用图片增强内容表现力呢?接下…

    2026年9月8日
    000
  • VSCode编码格式怎么设置_VSCode更改文件编码与解决乱码问题教程

    解决VSCode乱码需统一编码为UTF-8,优先通过状态栏编码选项重新打开或保存文件,设置全局默认编码为utf8并开启autoGuessEncoding,针对项目在.vscode/settings.json中配置特定编码,排查系统区域、终端编码及程序内编码处理,确保各环节编码一致。 VSCode中调…

    2026年9月8日
    000
  • VSCode怎么样运行_VSCode执行不同语言代码的基本方法教程

    VSCode运行不同语言代码的核心在于其强大的扩展生态系统、灵活的内置终端以及对调试器的良好集成。简单来说,你需要为特定语言安装对应的扩展,然后通过扩展提供的运行/调试按钮,或者直接在集成终端中调用语言解释器或编译器来执行代码。 VSCode作为我个人最常用的代码编辑器,它能运行各种语言代码,这背后…

    2026年9月8日
    000
  • 使用TextMate打开PHP后缀文件的操作方法_Mac下高效编辑PHP后缀文件的技巧

    首先将TextMate设为.php文件默认打开程序,右键选择“打开方式”并勾选“始终以此方式打开”;接着通过终端输入mate文件名或路径可快速编辑;确保语法模式为PHP并利用代码片段如foreach+Tab提升效率;最后自定义快捷键、启用行号与高亮当前行,并使用项目抽屉管理多文件,从而全面提升开发效…

    2026年9月8日
    200
  • PHP7和PHP8在递增操作上有什么新特性_PHP递增操作符版本差异

    PHP7与PHP8在递增操作符行为上保持一致,均支持前置++$i(先加后返)和后置$i++(先返后加),字符串可转数字递增,null递增为1,布尔值无效;PHP8未改变该逻辑,仅将致命错误改为抛出Error异常,实际使用建议检查变量类型并避免对null或布尔值操作。 PHP7 和 PHP8 在递增操…

    2026年9月7日
    100
  • VSCode怎么运行代码网页_VSCode搭建本地服务器运行网页教程

    VSCode本身并不能直接“运行”一个代码网页,因为它本质上是一个文本编辑器。我们通常说的“运行”网页,指的是在浏览器中预览和交互。为了实现这一点,尤其是当网页包含JavaScript动态内容、需要加载外部资源或模拟后端请求时,我们需要一个本地服务器环境。最直接且常用的方法是利用VSCode的扩展,…

    2026年9月7日
    000
  • VSCode集成终端使用技巧_VSCode终端运行多语言代码教程

    VSCode集成终端是开发工作流的神经中枢,支持多会话管理、自定义Shell、任务自动化、调试联动和环境隔离,实现代码编辑与命令执行的无缝衔接,显著提升多语言项目开发效率。 VSCode的集成终端,在我看来,远不止是一个简单的命令行界面。它更像是你整个开发工作流的神经中枢,一个让你能从代码编辑、运行…

    2026年9月7日
    100
  • VSCode插件开发怎么调试_VSCode扩展插件开发与调试方法教程

    调试VSCode插件需通过“扩展开发宿主”窗口运行,核心是配置launch.json并设置断点。首先确保项目含正确type为extensionHost的launch配置,检查runtimeExecutable路径;若断点未命中,需确认代码执行路径、sourceMap生成及outFiles指向编译后文…

    2026年9月7日
    100
  • CentOS 7编译安装/一键安装Python 3

    在centos 7系统中,默认已安装python 2.7,但有些应用可能需要使用python 3。本文将介绍如何在centos 7上安装python 3,同时不影响已有的python 2.7环境,实现两者共存。 编译安装Python 3 当前Python的最新版本是Python 3.7.0,若有更新…

    2026年9月7日
    100
  • 在 Spring Boot Web 应用程序中序列化枚举

    枚举类型在定义应用程序域内有限且明确的值集方面非常有效,有助于避免代码中出现无效状态。 应用场景 以下以一个Spring Boot 3.3.x 和 MongoDB 实现的笔记Web应用为例,演示枚举值的序列化和反序列化方法。 我们将定义一个Type枚举,表示待办事项的类型:事件和活动。 public…

    2026年9月7日
    000
  • CentOS系统部署怎么操作_CentOS系统快速部署指南

    CentOS部署需先选择版本与安装模式,推荐生产环境使用AlmaLinux或Rocky Linux,优先采用最小化安装以提升安全性和性能;接着通过手动分区(建议包含/boot、swap、/、/var等)并启用LVM增强灵活性,配置网络、主机名及用户权限,设置强密码并创建带sudo权限的普通用户;安装…

    2026年9月7日
    000
  • 《生化危机9》首批细节和新截图 可自由切换第一/第三人称、新的追踪者

    《生化危机9》首批细节和新截图 可自由切换第一/第三人称、新的追踪者《生化危机9》首批细节和新截图 可自由切换第一/第三人称、新的追踪者《生化危机9》首批细节和新截图 可自由切换第一/第三人称、新的追踪者《生化危机9》首批细节和新截图 可自由切换第一/第三人称、新的追踪者

    果然如舅舅所说,《生化危机9》的媒体前瞻现已解禁,玩家们也迎来了新一轮情报更新,包括全新的截图和文字细节。 《生化危机9》片段: 以下是来自外媒IGN与Rockpapershotgun的前瞻内容汇总: ·玩家可在菜单中自由切换第一人称与第三人称视角 ·一位“熟悉”的角色确认回归,但是否能操控其他角色…

    2026年9月7日 用户投稿
    200
  • Java如何定义构造方法 构造方法与普通方法的区别

    构造方法用于初始化对象,名称必须与类名相同,无返回类型,可重载;创建对象时自动调用,与普通方法在命名、返回值、调用方式等方面有明显区别。 在Java中,构造方法(Constructor)是一种特殊的方法,用于在创建对象时初始化对象的成员变量。它会在使用 new 关键字实例化对象时自动调用。 如何定义…

    2026年9月7日
    200
  • Java中JDK 与 JRE 的区别是什么?

    JRE用于运行Java程序,提供必要环境;JDK是开发工具包,包含JRE及用于创建和调试Java程序的工具(如编译器和调试器)。具体区别包括:大小:JDK大于JRE,因包含更多工具;依赖关系:JDK包含JRE,但反之则否;安装路径:JDK安装目录包含jre子目录(JDK自带JRE);环境变量:Jav…

    2026年9月7日
    200
  • 用慢思考提升模型安全性,北交大、鹏城实验室提出系统2对齐

    用慢思考提升模型安全性,北交大、鹏城实验室提出系统2对齐用慢思考提升模型安全性,北交大、鹏城实验室提出系统2对齐用慢思考提升模型安全性,北交大、鹏城实验室提出系统2对齐用慢思考提升模型安全性,北交大、鹏城实验室提出系统2对齐

    aixiv专栏:北京交通大学adam团队探索系统2对齐,提升大模型安全性 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 北京交通大学ADaM团队长期关注AI安全领域,此前已开源o1复现项目o1-Coder (https://www.php.…

    2026年9月7日 用户投稿
    000
  • Java中public, private, protected, 默认的区别?

    Java访问修饰符定义了类成员的可见性:public:任何地方可见private:仅限该类内部可见protected:包内和子类可见默认(包访问权限):仅限包内可见 Java访问修饰符:权限的艺术 你可能在Java代码里见过public、private、protected以及那个啥也不写的默认修饰符…

    2026年9月7日
    100
  • Java中while 和 do while 有啥区别?

    Java 的 while 和 do while 循环之间的主要区别在于条件判断的时机:while 循环:先判断条件,条件为真时执行循环体。do while 循环:先执行循环体,后再判断条件。此细微差别影响着循环的执行:while 循环可能不执行,而 do while 循环至少会执行一次。在需要确保循…

    2026年9月7日
    100
  • 普通人翻唱放到抖音可以吗?翻唱火了算侵权吗

    随着抖音等短视频平台的普及,越来越多用户热衷于通过翻唱歌曲来展示个人才艺。翻唱内容也因此成为平台上备受欢迎的创作形式之一。然而,对于普通用户而言,在抖音发布翻唱作品是否涉及法律风险,尤其是版权问题,始终是关注的焦点。本文将深入剖析翻唱行为的版权边界,并提供安全合规的发布建议。 一、关于翻唱的版权归属…

    2026年9月7日
    100
  • 新windows提权之WerTrigger

    用法: 代码语言:javascript代码运行次数:0运行复制 As an administrator, copy phoneinfo.dll to C:WindowsSystem32Place Report.wer file and WerTrigger.exe in a same directo…

    2026年9月7日
    000

发表回复

登录后才能评论
关注微信