Java中的record使用详解

2025-06-06 03:50
文章标签 java 使用 详解 record

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

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友...

1. 什么是 record?

定义recordJava 14 引入的一种javascript新语法(在 Java 16 中成为正式功能),用于定义不可变的数据类。

  • 目的:简化那些主要用于存储数据的类的定义,减少样板代码。
  • 特点
    • 自动实现构造函数。
    • 自动生成 equals()hashCode()toString() 方法。
    • 字段默认是 private final,且不可修改。

2. 基本语法

public record ClassName(Type fieldNhttp://www.chinasem.cname1, Type fieldName2, ...) {
    // 可选:可以添加额外的方法或逻辑
}

示例

public record Point(int x, int y) {
}

等价于以下传统类定义:

public final class Point {
    private final int x;
    private final int y;
    // 全参构造器
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Getter 方法
    public int x() { return x; }
    public int y() { return y; }
    // 自动覆盖 equals 和 hashCode
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Point)) return false;
        Point other = (Point) obj;
        return this.x == other.x && this.y == other.y;
    }
    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
    // 自动覆盖 toString
    @Override
    public String toString() {
        return "Point[x=" + x + ", y=" + y + "]";
    }
}

3. record 的核心特性

(1)字段不可变

  • record 的字段默认是 private final,且不能被修改。
  • 示例:
public record Point(int x, int y) {}
Point p = new Point(1, 2);
// p.x = 3; // 编译错误:x 是 final 的,不能修改

(2)自动生成方法

  • 构造函数:根据字段自动生成全参构造函数。
  • getter 方法:为每个字段生成对应的 getter 方法(名称与字段名相同)。
  • equals()hashCode()toString():根据字段自动生成这些方法。

示例

Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
System.out.println(p1.equals(p2)); // 输出 true
System.out.println(p1.hashCode()); // 输出基于字段值的哈希码
System.out.println(p1);           // 输出 Point[x=1, y=2]

(3)简洁性

  • 不需要手动编写构造函数、getter 方法、equals()hashCodejavascript()toString()
  • 适合用来定义简单的数据载体类。

4. 使用场景

(1)封装简单数据结构

  • 当你需要一个类来表示一组不可变的数据时,可以使用 China编程record
  • 示例:
public record User(String name, int age) {}
User user = new User("Alice", 25);
System.out.println(user.name()); // 输出 Alice

(2)配置类

  • 在 Spring Boot 等框架中,可以用 record 定义配置类。
  • 示例:
@ConfigurationProperties(prefix = "app")
public record AppProperties(String name, int port) {}

(3)DTO(数据传输对象)

  • 在微服务或前后端交互中,record 是一个很好的选择,用于定义 DTO。
  • 示例python
public record BookDto(String title, String author, double price) {}

5. 自定义行为

虽然 record 自动生成了许多方法,但你仍然可以对其进行扩展。

(1)添加额外方法

可以在 record 中定义额外的方法。

public record Point(int x, int y) {
    public double distanceFromOrigin() {
        return Math.sqrt(x * x + y * y);
    }
}
Point p = new Point(3, 4);
System.out.println(p.distanceFromOrigin()); // 输出 5.0

(2)自定义构造函数

你可以通过紧凑构造函数对字段进行验证或其他操作。

public record Point(int x, int y) {
    public Point {
        if (x < 0 || y < 0) {
            throw new IllegalArgumentException("Coordinates cannot be negative");
        }
    }
}
// Point p = new Point(-1, 2); // 抛出异常

紧凑构造函数 是 record 提供的一种简洁语法,用于在不手动写构造参数和赋值的前提下,插入自定义逻辑(如校验),简洁高效,专为不可变数据对象设计。

6. 注意事项

(1)字段不可变

  • record 的字段默认是 final,不能被修改。
  • 如果需要可变字段,不能使用 record

(2)继承限制

  • record 不能继承其他类(因为它是隐式 final 的)。
  • 它的本质是一种语法糖,编译器帮你自动生成如下内容:
public final class Point extends java.lang.Record {
    private final int x;
    private final int y;
    // 自动生成构造方法、getters、toString、equals、hashCode 等
}

record 可以实现接口。

public record Point(int x, int y) implements Serializable {}

(3)不适合复杂逻辑

record 主要用于简单的数据载体,不适合包含复杂的业务逻辑。

(4)兼容性

  • record 需要 JDK 14 或更高版本。
  • 如果你的项目需要兼容低版本 JDK,则不能使用 record

7. 总结

优点

  • 减少样板代码。
  • 提高代码可读性和维护性。自动生成常用方法(如 equals()hashCode()toString())。

适用场景

  • 封装简单数据结构。
  • 配置类。
  • DTO(数据传输对象)。

限制

  • 字段不可变。
  • 不能继承其他类。
  • 不适合复杂逻辑。

到此这篇关于Java中的record详解的文章就介绍到这了,更多相关Java record内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java中的record使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用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.

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

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

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

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

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