1. 什么是 record?
定义:record
是 java 14 引入的一种新语法(在 java 16 中成为正式功能),用于定义不可变的数据类。
- 目的:简化那些主要用于存储数据的类的定义,减少样板代码。
- 特点:
- 自动实现构造函数。
- 自动生成
equals()
、hashcode()
和tostring()
方法。 - 字段默认是
private final
,且不可修改。
2. 基本语法
public record classname(type fieldname1, 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()
、hashcode()
和tostring()
。 - 适合用来定义简单的数据载体类。
4. 使用场景
(1)封装简单数据结构
- 当你需要一个类来表示一组不可变的数据时,可以使用
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。 - 示例:
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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论