本文主要是介绍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使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!