record类型-Java 16
record
是一种特殊的类,主要用于简化不可变数据载体的定义。
record 记录名(组件列表) {// 可选:额外的方法、静态字段等
}
示例
// 定义一个Person记录
record Person(String name, int age) {}// 使用
public class Main {public static void main(String[] args) {Person p = new Person("张三", 25);System.out.println(p.name()); // 自动生成的访问器方法System.out.println(p.age());System.out.println(p); // 自动生成的toString()}
}
主要特性
-
自动生成的方法:
-
规范构造函数(canonical constructor)
-
组件访问器(如
name()
、age()
) -
equals()
和hashCode()
-
toString()
-
-
不可变性:
-
所有字段都是final的
-
不能添加实例字段(只能有静态字段)
-
-
可以自定义:
-
可以重写自动生成的方法
-
可以添加额外的方法
-
可以实现接口
-
自定义示例
public class Main {public static void main(String[] args) {Point p1 = new Point(3, 4);System.out.println(p1.distanceFromOrigin()); // 输出 5.0Point p2 = new Point(-1, 5); // 抛出异常:坐标不能为负System.out.println(Point.ORIGIN); // 输出: Point[x=0, y=0]}
}record Point(int x, int y) {// 添加静态字段public static final Point ORIGIN = new Point(0, 0);// 添加方法public double distanceFromOrigin() {return Math.sqrt(x*x + y*y);}// 重写自动生成的访问器@Overridepublic int x() {return x > 0 ? x : 0;}// 自定义构造函数public Point {if (x < 0 || y < 0) {throw new IllegalArgumentException("坐标不能为负");}}
}
与普通类的区别
特性 | record | 普通类 |
---|---|---|
目的 | 数据载体 | 通用 |
不可变性 | 自动 | 需要手动实现 |
样板代码 | 自动生成 | 需要手动编写 |
继承 | 隐式继承Record类 | 可自由继承 |
字段 | 仅限记录组件 | 可自由添加 |
使用场景
-
数据传输对象(DTO)
-
方法返回多个值
-
临时数据聚合
-
需要值语义的简单类型