记录模式
记录模式(Record Patterns)第一次发布预览是在 JDK 19、随后又在 JDK 20 中进行了完善。现在,Java 21 开始正式推出该特性优化。下面我们通过一个例子来理解这个新特性。
record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x+y); } }
上述代码中定义了一个名为 Point 的 record 类。如果我们想要获取、操作或者打印 Point 中的 x 和 y 的话。就不得不先完成类型判断和类型转换。所以,这里为了实现 x + y 总共需要 4 行代码。而在 Java 21 之后,只需要 2 行代码就能完成:
static void printSum(Object obj) { if (obj instanceof Point(int x, int y)) { System.out.println(x+y); } }
可以看到,类型判断、类型转换、record 值的结构都一气呵成了,所以代码量得到了简化。
嵌套 record 的解构
假设有下面一组嵌套的 record 结构(WindowFrame
中包含了Point
和Size
):
record Size(int width, int height) { } record Point(int x, int y) { } record WindowFrame(Point origin, Size size) { }
这个时候,如果想要访问 WindowFrame
中 Size
的 height,根据之前案例的理解,我们可以这样写:
if (obj instanceof WindowFrame wf) { if (wf.size() != null) { System.out.println("Height: " + wf.size().height()); } }
好像也没有很简单,但实际上还有更简单的写法,因为 record 的解构是可以嵌套的,直接这样一步完成即可:
if (obj instanceof WindowFrame(Point origin, Size(int width, int height))) { System.out.println("Height: " + height); }