Java Record简介

 更新时间:2025年06月20日 10:07:02   作者:禾小西  
Java Record是一种特殊的类,旨在简化与数据传输对象(DTO)相关的工作,下面通过本文给大家介绍Java Record的相关知识,感兴趣的朋友一起看看吧

在Java中,随着JDK 14引入的方案封闭特性(Preview Feature),在JDK 16中,Record成为了一种正式的特性。Record类型为Java程序员提供了一种更加简洁和有效的方式来定义数据类。本文将详细探讨Java Record的使用,并通过代码示例帮助大家更好地理解其特性。

什么是Java Record?

Java Record是一种特殊的类,旨在简化与数据传输对象(DTO)相关的工作。与传统类相比,Record提供了更少的样板代码和更好的表达能力。Record自动实现了equals、hashCode、toString等方法,这使得我们不再需要为简单的数据容器类型编写冗长的代码。

Record的基本语法

使用Record非常简单。以下是Record的基本语法:

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

在这个例子中,我们定义了一个名为Person的Record,它包含两个属性:name(字符串类型)和age(整型)。编译器将自动生成构造函数、getter方法、equals、hashCode和toString方法。

使用Record的优势

使用Record的优势主要体现在以下几个方面:

  • 减少样板代码:Record自动生成常用方法,减少了样板代码的编写。
  • 不可变性:Record的属性默认是final的,因此对象在创建后无法更改,确保数据的一致性和安全性。
  • 易于维护:由于Record的简洁性,代码更易于理解和维护。

一、Record 的诞生背景

Java 的 Record(记录类)是 Java 14 引入的预览特性,于 Java 16 正式标准化。其设计初衷是简化不可变数据类的定义,解决传统 POJO 类中大量样板代码(如构造器、getter、equals、hashCode、toString 等)的问题。例如,一个简单的 Person 类在传统写法中需要 30+ 行代码,而用 Record 只需一行。

传统类 vs Record 类

// 传统 POJO(30+ 行)
public class Person {
    private final int id;
    private final String name;
    // 构造器、getter、equals、hashCode、toString...
}
// Record 等效实现(1 行)
public record Person(int id, String name) {}

通过 Record,开发者可以专注于数据本身,而非重复的模板代码。

二、Record 的核心特性

  • 不可变性

    • Record 的所有字段默认是 final 的,创建后不可修改,天然线程安全。
    • 适用于 DTO、配置项等需要数据一致性的场景。
  • 自动生成方法

    • 编译器自动生成以下方法:
      • 全参构造器
      • 字段访问器(如 id()name(),而非 getId()
      • equals()hashCode()toString()
  • 简洁语法

    • 使用 record 关键字定义,语法紧凑:
public record Point(int x, int y) {}
  • 限制性设计

    • Record 类是隐式 final 的,不可被继承。
    • 不能声明非静态实例字段(仅允许通过参数列表定义字段)。

三、Record 的基本用法

1. 定义与实例化

public record User(String username, String email) {}
// 实例化
User user = new User("Alice", "alice@example.com");
System.out.println(user.username()); // 输出 "Alice"

2. 自定义方法

Record 允许添加自定义方法:

public record Circle(double radius) {
    // 计算面积
    public double area() {
        return Math.PI * radius * radius;
    }
}

3. 参数校验(紧凑构造器)

通过紧凑构造器实现字段校验:

public record Email(String address) {
    public Email {
        if (!address.contains("@")) {
            throw new IllegalArgumentException("Invalid email");
        }
    }
}

4. 实现接口与泛型

Record 可以实现接口,支持泛型:

public record Pair<T, U>(T first, U second) implements Serializable {
    public String toJson() {
        return "{ \"first\": \"" + first + "\", \"second\": \"" + second + "\" }";
    }
}

四、Record 的进阶应用

  • 替代 DTO/VO

    • 快速定义 API 响应模型:
public record ApiResponse<T>(int code, String message, T data) {}
  • 模式匹配(Java 17+)

    • 结合 instanceof 解构数据:
Object obj = new Point(3, 4);
if (obj instanceof Point(int x, int y)) {
    System.out.println("坐标: (" + x + ", " + y + ")");
}
  • 数据库映射

    • 简化 JDBC 结果集处理:
try (ResultSet rs = statement.executeQuery()) {
    return new User(rs.getInt("id"), rs.getString("name"));
}
  • 函数式编程

    • 作为轻量级元组(如 PairTriple):
record Pair<A, B>(A first, B second) {}
List<Pair<String, Integer>> pairs = List.of(new Pair<>("Java", 1995));

五、Record 与 Lombok 的对比

特性RecordLombok
不可变性默认支持需手动添加 final
代码生成语言原生支持依赖注解处理器
模式匹配完全兼容不支持
兼容性需 JDK 16+兼容旧版本
可变性不可变支持可变类(如 @Data

选择建议

  • 优先 Record:需不可变类、使用模式匹配或 JDK 16+ 环境。
  • 选择 Lombok:需可变类或兼容旧代码。

六、注意事项

  • 不可继承性

    • Record 不能继承其他类(隐式继承 java.lang.Record)。
  • 字段限制

    • 所有字段必须通过参数列表声明,不支持动态添加实例字段。
  • 序列化

    • 需显式实现 Serializable 接口。
  • 框架兼容性

    • 部分框架(如旧版 Spring)可能需适配 Record 类型。

七、未来展望

  • 模式匹配增强:与 sealed class 结合,构建更严格的类型系统。
  • 框架整合:Spring 等框架或默认支持 Record 作为数据载体。
  • 函数式扩展:与 Stream、Optional 深度结合,提升代码表现力。

总结

Java Record 通过极简语法和不可变性,显著减少了数据类的样板代码,同时提升了代码安全性和可维护性。其适用于 DTO、模式匹配、函数式编程等场景。

到此这篇关于Java Record简介的文章就介绍到这了,更多相关Java Record内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目如何访问jsp页面的示例代码

    SpringBoot项目如何访问jsp页面的示例代码

    本篇文章主要介绍了SpringBoot项目如何访问jsp页面的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java嵌套类和内部类详解

    Java嵌套类和内部类详解

    这篇文章主要介绍了Java嵌套类和内部类详解,本文讲解了什么是嵌套类及内部类、静态嵌套类、在外部类中定义内部类、在方法中定义内部类、匿名内部类等内容,需要的朋友可以参考下
    2015-04-04
  • 从语法到实战的全面剖析Java接口

    从语法到实战的全面剖析Java接口

    在 Java 中,接口(interface)正是这样一种公共规范:它定义了多个类应遵循的方法标准,所有实现该接口的类都必须按照标准实现这些方法,从而实现 “通用” 的目的,这篇文章主要介绍了从语法到实战的全面剖析Java接口,需要的朋友可以参考下
    2025-09-09
  • startActivityForResult和setResult案例详解

    startActivityForResult和setResult案例详解

    这篇文章主要介绍了startActivityForResult和setResult案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot请求响应方式示例详解

    SpringBoot请求响应方式示例详解

    这篇文章主要介绍了SpringBoot请求响应的相关操作,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • mybatis中注解映射SQL示例代码

    mybatis中注解映射SQL示例代码

    这篇文章主要给大家介绍了关于mybatis中注解映射SQL的相关资料,文中给出了详细的示例代码供大家参考学习,对大家的学习或者共组具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 浅谈Java8的特性之Optional类

    浅谈Java8的特性之Optional类

    这篇文章主要介绍了浅谈Java8的特性之Optional类,Optional类是 Java 8 引入的一个很有趣的特性,Optional 类是一个可以为null的容器对象,它主要解决的问题是臭名昭著的空指针异常,需要的朋友可以参考下
    2023-08-08
  • idea新窗口打开工程不生效问题及解决

    idea新窗口打开工程不生效问题及解决

    文章提供了解决在Macos系统中,使用某些浏览器打开链接时无法新窗口打开的解决方案,包括设置OpenProjectInNewWindow和将首选打开方式设置为“永不”
    2026-04-04
  • Eclipse中导出码云上的项目方法(图文教程)

    Eclipse中导出码云上的项目方法(图文教程)

    下面小编就为大家带来一篇Eclipse中导出码云上的项目方法(图文教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 关于BufferedReader的读取效率问题

    关于BufferedReader的读取效率问题

    这篇文章主要介绍了关于BufferedReader的读取效率问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论