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的話。就不得不先完成類型判斷和類型轉(zhuǎn)換。所以,這里為了實現(xiàn)x+y總共需要4行代碼。而在Java 21之后,只需要2行代碼就能完成:
static void printSum(Object obj) {
if (obj instanceof Point(int x, int y)) {
System.out.println(x+y);
}
}
可以看到,類型判斷、類型轉(zhuǎn)換、record值的結(jié)構(gòu)都一氣呵成了,所以代碼量得到了簡化。
嵌套record的解構(gòu)
假設(shè)有下面一組嵌套的record結(jié)構(gòu)(WindowFrame
中包含了Point
和Size
):
record Size(int width, int height) { }
record Point(int x, int y) { }
record WindowFrame(Point origin, Size size) { }
這個時候,如果想要訪問WindowFrame
中Size
的height,根據(jù)之前案例的理解,我們可以這樣寫:
if (obj instanceof WindowFrame wf) {
if (wf.size() != null) {
System.out.println("Height: " + wf.size().height());
}
}
好像也沒有很簡單,但實際上還有更簡單的寫法,因為record的解構(gòu)是可以嵌套的,直接這樣一步完成即可:
if (obj instanceof WindowFrame(Point origin, Size(int width, int height))) {
System.out.println("Height: " + height);
}