JDK21中Record的用法全方位讲解(附完整示例)

 更新时间:2026年03月17日 08:41:54   作者:老虎码农  
JDK14首次引入Record类作为预览特性,并在JDK16中正式发布,而JDK21进一步强化了Record模式匹配能力,这篇文章主要介绍了JDK21中Record用法全方位讲解的相关资料,需要的朋友可以参考下

前言

record 是 Java 16 正式引入的新语法,用来编写轻量级、只包含数据的不可变类。
到了 JDK 21,record 已经非常成熟,并且配合模式匹配(Pattern Matching)可以写出更简洁的代码。

本文将从基础语法、构造器、方法、自定义校验到 JDK21 新特性全方位讲解 record 的使用方式。

1. 什么是 Record?

record 用来创建 不可变数据类(data carrier class)

它会自动帮你生成:

  • private final 字段

  • 构造器

  • equals()

  • hashCode()

  • toString()

  • getter(无前缀,方法名就是字段名)

2. Record 的基本使用

public record User(String name, int age) { }

使用方式:

User u = new User("Alice", 20);
System.out.println(u.name()); // Alice
System.out.println(u.age());  // 20

3. 自动生成的内容

假设你写了:

public record User(String name, int age) { }

Java 会自动生成等价于:

private final String name;
private final int age;

public User(String name, int age) { ... }

public String name() { return name; }
public int age() { return age; }

public boolean equals(Object o) { ... }
public int hashCode() { ... }
public String toString() { ... }

你完全不需要自己写!

4. Record 的构造器用法

(1)规范构造器(Canonical Constructor)

你可以给 record 添加校验逻辑:

public record User(String name, int age) {
    public User {
        if (age < 0) {
            throw new IllegalArgumentException("age must be >= 0");
        }
    }
}

这是最常用的方式。

(2)额外构造器(Overloaded Constructor)

public record Point(int x, int y) {
    public Point(int value) {
        this(value, value);
    }
}

5. 在 Record 中定义方法

record 和普通类一样可以添加方法:

public record User(String name, int age) {
    public String info() {
        return name + " (" + age + ")";
    }
}

6. Record 中允许与不允许的内容

允许的内容

  • 定义方法

  • 定义静态字段、静态方法

  • 实现接口

  • 重写构造器

  • 使用注解

不允许的内容

  • 不能继承其他类(但可以实现接口)

  • 不能定义可变字段(如 int x;

  • 不能定义 setter

例如:

public record User(String name) {
    private int age; // ❌ 编译错误
}

7. Record 是否真的不可变?(深浅不可变问题)

record 提供的是浅不可变:字段本身是 final,但字段内部对象可以变。

例子:

public record Order(String id, List<String> items) { }

Order o = new Order("1", new ArrayList<>(List.of("A", "B")));
o.items().add("C"); // ❗Allowed(内部 List 可以变)

如果你需要深不可变,可以在构造器里拷贝:

public record Order(String id, List<String> items) {
    public Order {
        items = List.copyOf(items);
    }
}

8. Record 搭配 sealed(JDK21 完整支持)

在 JDK21 中,你可以把 record 放进 sealed 层级结构:

public sealed interface Shape permits Circle, Rectangle { }

public record Circle(double r) implements Shape { }
public record Rectangle(double w, double h) implements Shape { }

这让 record 特别适合建模领域对象(DDD)。

9. Record 模式匹配(Pattern Matching)→ JDK21 新特性

从 JDK 21 开始,switch 可以直接解构 record:

record Point(int x, int y) {}

static String format(Object o) {
    return switch (o) {
        case Point(int x, int y) -> "Point: " + x + "," + y;
        default -> "Unknown";
    };
}

这让 record 使用起来更像 Kotlin 的 data class。

10. 总结

能力是否支持
自动生成构造器、equals、hashCode、toString
字段不可变(final)
深不可变❌(需要自己处理)
实现接口
继承类
自定义构造器
模式匹配(JDK21)

Record 的核心价值:少写大量模板代码,写出更简洁、安全的数据类。

到此这篇关于JDK21中Record用法全方位讲解的文章就介绍到这了,更多相关JDK21中Record用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java每隔两个数删掉一个数问题详解

    Java每隔两个数删掉一个数问题详解

    这篇文章主要介绍了Java每隔两个数删掉一个数问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • spring整合mybatis的底层原理分析

    spring整合mybatis的底层原理分析

    这篇文章主要介绍了spring整合mybatis的底层原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 关于Java实现HttpServer模拟前端接口调用

    关于Java实现HttpServer模拟前端接口调用

    这篇文章主要介绍了关于Java实现Http Server模拟前端接口调用,Http 协议是建立在 TCP 协议之上的协议,所以能用 TCP 来自己模拟一个简单的 Http Server 当然是可以的,需要的朋友可以参考下
    2023-04-04
  • SpringBoot 注解 @AutoConfiguration 在 2.7 版本中被新增的使用方法详解

    SpringBoot 注解 @AutoConfiguration 在 2.7 版本中被新增的使用方法详解

    这篇文章主要介绍了SpringBoot 注解 @AutoConfiguration 在 2.7 版本中被新增(使用方法),本文给大家介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • 详谈Java中的事件监听机制

    详谈Java中的事件监听机制

    下面小编就为大家带来一篇详谈Java中的事件监听机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot配置log4j输出日志的案例讲解

    SpringBoot配置log4j输出日志的案例讲解

    这篇文章主要介绍了SpringBoot配置log4j输出日志的案例讲解,springboot框架中默认使用logback进行日志输出,当然它也可以配置其它的日志框架,需要的朋友可以参考下
    2022-11-11
  • 如何利用泛型封装通用的service层

    如何利用泛型封装通用的service层

    这篇文章主要介绍了如何利用泛型封装通用的service层,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 一篇文章深入聊聊Java的内存模型

    一篇文章深入聊聊Java的内存模型

    这篇文章主要介绍了Java内存模型的相关资料,JMM是Java内存模型,它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-02-02
  • SWT(JFace)体验之List演示汇总

    SWT(JFace)体验之List演示汇总

    SWT(JFace)体验之List演示代码汇总
    2009-06-06
  • Spring Boot整合流控组件Sentinel的场景分析

    Spring Boot整合流控组件Sentinel的场景分析

    Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑,这篇文章主要介绍了Spring Boot整合流控组件Sentinel的过程解析,需要的朋友可以参考下
    2021-12-12

最新评论