Java Records: 简化数据携带类的利器
引言
在 Java 14 中引入并在 Java 16 中成为正式特性的 record
,是为了简化不可变数据携带类的创建。它极大地减少了样板代码,使得代码更加简洁和易读。本文将详细介绍 record
的用法和特点。
什么是 Record?
record
是一种特殊的类,用于表示不可变的数据携带类。它自动为所有字段生成构造函数、equals()
、hashCode()
和 toString()
方法,从而简化了数据类的编写。
定义和语法
定义一个 record
非常简单。它的语法如下:
public record Point(int x, int y) {}
以上代码定义了一个名为 Point
的 record
,它包含两个字段:x
和 y
。编译器将自动生成构造函数、访问器方法、equals()
、hashCode()
和 toString()
方法。
详细用法
1. 自动生成的方法
当定义一个 record
时,编译器会自动生成以下内容:
- 构造函数:接受所有字段作为参数。
- 访问器方法:每个字段都有一个方法来返回其值。
equals()
方法:比较两个record
对象的字段值。hashCode()
方法:基于字段值生成哈希码。toString()
方法:返回包含字段值的字符串表示。
示例:
public record Point(int x, int y) {}public class Main {public static void main(String[] args) {Point point = new Point(1, 2);System.out.println(point.x()); // 输出: 1System.out.println(point.y()); // 输出: 2System.out.println(point); // 输出: Point[x=1, y=2]}
}
2. 自定义构造函数
虽然 record
自动生成了构造函数,但你也可以定义自己的构造函数,例如进行参数验证:
public record Point(int x, int y) {public Point {if (x < 0 || y < 0) {throw new IllegalArgumentException("Coordinates must be non-negative");}}
}
3. 添加方法
你可以向 record
添加方法,以扩展其功能:
public record Point(int x, int y) {public int sum() {return x + y;}
}
4. 嵌套的 Record
record
可以嵌套在其他类或接口中:
public class Geometry {public record Point(int x, int y) {}
}
5. 静态字段和方法
record
可以包含静态字段和方法,但不能包含实例字段:
public record Point(int x, int y) {public static final Point ORIGIN = new Point(0, 0);public static double distance(Point p1, Point p2) {return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));}
}
使用场景
record
主要用于以下场景:
- 数据传输对象 (DTO):简化数据传输对象的定义和实现。
- 不可变对象:确保对象状态不可变,提供线程安全性。
- 配置对象:定义包含配置信息的简单对象。
总结
record
是 Java 语言中强大的新特性,它简化了数据携带类的创建,减少了样板代码,使得代码更加简洁和易读。在需要不可变对象的场景下,record
是一个非常有用的工具。
希望这篇博文能帮助你理解并使用 record
,提升你的 Java 编程体验。
示例代码下载
你可以通过以下链接下载示例代码:[下载链接]
参考资料
- Java 14: JEP 359: Records (Preview)
- Java 16: JEP 395: Records
如有任何问题或建议,请在评论区留言。感谢阅读!