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类(Java 16中的新特性),如果我们想要获取、操作或者打印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);
}