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

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1