在Java中,记录类(Record)是一种特殊的数据类,用于简化不可变数据对象的创建和使用。记录类是在Java 14中作为预览功能引入的,并在Java 16中成为正式功能。
记录类的特点
- 不可变性:记录类的实例是不可变的,所有字段都是
final
的。 - 自动生成方法:编译器会自动为记录类生成构造函数、
equals()
、hashCode()
和toString()
方法。 - 简化的声明:声明记录类的语法非常简洁,只需要定义字段,其他方法由编译器自动生成。
记录类的语法
记录类使用record
关键字定义。其基本语法如下:
public record ClassName(Type fieldName1, Type fieldName2, ...) {}
示例代码
使用记录类表示坐标
public record Point(int x, int y) {}
数据传输对象
public record UserDTO(String name, String email, int age) {}
读取配置
public record Configuration(String url, int timeout, boolean debug) {}
临时数据结构
public record Pair<A, B>(A first, B second) {}
public class Example {
public static void main(String[] args) {
Pair<Integer, String> pair = new Pair<>(1, "One");
System.out.println(pair.first()); // 输出: 1
System.out.println(pair.second()); // 输出: One
}
}
使用记录类的这些场景有助于提高代码的简洁性和可读性,并且使得不可变数据对象的定义更加直观和高效。
记录类的其他特性
1. 自定义方法:
虽然记录类自动生成了一些方法,但你仍然可以定义自己的方法。
public record Point(int x, int y) {
// 自定义方法
public double distanceFromOrigin() {
return Math.sqrt(x * x + y * y);
}
}
2. 自定义构造函数:
你可以定义一个紧凑的构造函数来添加额外的逻辑。
public record Point(int x, int y) {
public Point {
if (x < 0 || y < 0) {
throw new IllegalArgumentException("Coordinates must be non-negative");
}
}
}
3. 静态字段和方法:
记录类可以包含静态字段和方法。
public record Point(int x, int y) {
public static Point ORIGIN = new Point(0, 0);
public static double distance(Point p1, Point p2) {
return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
}
}
使用场景
记录类(Record)在以下情况下特别有用:
1. 不可变数据对象
记录类非常适合表示那些在创建后不会改变的简单数据对象。典型的例子包括坐标、配置值、数据传输对象(DTO)等。
2. 减少样板代码
当你需要定义包含多个字段的简单类,并且这个类需要equals()
、hashCode()
、toString()
方法以及构造函数时,记录类可以自动生成这些方法,减少样板代码。
3. 数据传输对象(DTO)
记录类适用于表示数据传输对象,即在应用程序的不同层或不同服务之间传递数据的对象。
4. 轻量级的值对象
记录类适合表示轻量级的值对象(Value Object),这些对象主要用于封装一组相关的值,并且具有不可变性。
5. 读取配置或设置
记录类可以用来表示读取配置文件或设置的结果,将多个相关的配置项封装在一个不可变的对象中。
6. 临时数据结构
在需要临时存储一组相关数据的情况下,可以使用记录类而不是定义一个完整的类。例如,在函数内创建和返回一组相关的值。
7. 简化代码维护
由于记录类减少了手动编写和维护样板代码的需求,它有助于提高代码的可读性和可维护性。