【Java】Record的使用 (简洁教程)

2024-08-28 01:12
文章标签 java 使用 教程 record 简洁

本文主要是介绍【Java】Record的使用 (简洁教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 为什么引入Record
    • 4.2 Record与Class区别
    • 4.3 使用场景
  • 五、总结:
    • 5.1 场景使用
    • 5.2 字段的定义

一、前言

  • 学习Record有什么用

二、学习内容:

  • Record与Class的区别以及Record使用场景

三、问题描述

  • 为什么引入Record以及Record的作用

四、解决方案:

4.1 为什么引入Record

Java 引入 record 的主要原因是为了简化创建不可变数据类的过程,并提高代码的可读性和维护性。

以下是一些具体的原因:

减少样板代码:

  • 🌟 record 自动生成构造器、equals()、hashCode() 和 toString() 方法,以及每个字段的 getter方法,这样开发人员就可以专注于业务逻辑而不是样板代码。

不可变性:

  • 🌟 record 的所有字段默认是 final 的,这意味着它们是不可变的。这有助于创建线程安全和易于管理的数据模型。

简洁性:

  • record 允许你用更少的代码来定义数据类,使得类的定义更加清晰和简洁。

性能优化:

  • record 类型可能🌟 受到编译器的特定优化,例如更有效的内存布局,从而可能带来性能上的提升。

模式匹配的支持:

  • record 在模式匹配方面有更好的支持,这在 Java 14 及以后的版本中变得更加重要,尤其是在使用结构化绑定和改进的 switch
    表达式时。

易于调试:

  • 由于 record 自动提供了 toString() 方法,因此在调试时可以更容易地查看对象的状态。

明确的意图:

  • 使用 record 明确地表明了类的目的是作为一个简单的数据载体,这对于其他开发人员阅读代码时是有帮助的。

4.2 Record与Class区别

  • 观察下面Class代码与Record代码的区别
  • Class
package org.example.recodes;import java.util.Objects;public class Cat {String name;public String getName() {return name;}public Cat(String name) {this.name = name;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Cat cat = (Cat) o;return Objects.equals(name, cat.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}
  • Record
package org.example.recodes;public record RecordCat(String name) { }

🌟 上面两段代码是等效的

record 自动生成构造器、equals()、hashCode() 和 toString() 方法,以及每个字段的 getter方法

我们运行一下下面代码看看区别

package org.example.recodes;public class Main {public static void main(String[] args) {Cat cat = new Cat("mimi");System.out.println(cat.getName());System.out.println(cat);RecordCat recordCat = new RecordCat("momo");System.out.println(recordCat.name());System.out.println(recordCat);}
}

结果如下:
在这里插入图片描述

4.3 使用场景

它特别适用于那些仅用于存储数据而没有复杂业务逻辑的情况

Record所有字段默认是final
可扩展的部分包括:

非静态字段:

  • 虽然 record 默认所有的字段都是 final 的,但🌟你不能直接在 record 中添加非 final的字段。如果你需要这样的字段,应该使用 class。
public record Person(String name, int age) {  // 这是合法的,因为字段在声明中定义  // 不合法:不能再这里定义其他字段  // private final String address; // 这将导致编译错误  // 可以添加额外的方法  public String introduce() {  return String.format("My name is %s and I am %d years old.", name, age);  }  
}  

实例方法:

  • 除了 record 自动生成的方法外,你可以添加自己的实例方法来扩展 record 的功能。这些方法可以实现特定的业务逻辑或操作。

静态方法:

  • 你可以在 record 中添加静态方法,这些方法通常用于工厂模式,即创建 record 实例的替代构造方式。

私有方法:

  • 私有方法可以用来封装 record 内部的实现细节,例如辅助计算或验证逻辑。

嵌套类和内部类:

  • record 可以包含嵌套类和内部类,这些类可以用来定义相关的类型,比如枚举类型或其他辅助类。

接口实现:

  • record 可以实现一个或多个接口,这样就可以提供接口中定义的方法的实现。

注解:

  • record 可以使用注解来标记,这对于框架集成、元数据处理等非常有用。

泛型:

  • record 支持泛型,允许你定义泛型参数,从而创建通用的 record 类型。

覆盖默认方法:

  • 尽管 record 自动生成了一些方法,如 equals()、hashCode() 和toString(),你仍然可以覆盖这些方法以提供不同的实现。

五、总结:

5.1 场景使用

简单的数据使用

🌟 默认只有Getter方法

record Point(int x, int y) {// 无需显式定义构造器、equals()、hashCode() 或 toString()
}
public class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Point point = (Point) o;return x == point.x && y == point.y;}@Overridepublic int hashCode() {return Objects.hash(x, y);}@Overridepublic String toString() {return "Point{" +"x=" + x +", y=" + y +'}';}
}

5.2 字段的定义

🌟 在 Java 记录中,所有字段都必须在记录的参数列表中定义。
🌟 记录是不可变的:字段一旦赋值,不能被修改。
🌟 无法在记录内部定义额外的 private final 字段。

下面是相关解释

隐式 final:

  • 所有记录字段默认是 final,这意味着它们一旦被初始化,就不能再被修改

只能通过构造器定义:

  • 记录中的字段必须在记录声明的紧随其后的参数列表中定义,不能在记录的体内再次定义或声明。
  • 这意味着无法手动添加如 private final 字段,直接在类体内定义是非法的。

自动构造器和访问器:

  • Java 会为记录自动生成构造器,以及每个字段的访问器方法(getter)。因此,您不需要手动编写 getter 方法。
public record Person(String name, int age) {  // 这是合法的,因为字段在声明中定义  // 不合法:不能再这里定义其他字段  // private final String address; // 这将导致编译错误  // 可以添加额外的方法  public String introduce() {  return String.format("My name is %s and I am %d years old.", name, age);  }  
}  // 使用记录的主函数  
public class Main {  public static void main(String[] args) {  Person person = new Person("Alice", 30);  System.out.println(person.introduce()); // 输出:My name is Alice and I am 30 years old.  }  
}

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

这篇关于【Java】Record的使用 (简洁教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113311

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream