【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

相关文章

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表