本文主要是介绍Java中的record使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友...
1. 什么是 record?
定义:record
是 Java 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使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!