隨著 Java 16 的發布,引入了記錄(JEP 395),帶來了重大改進,它允許以更簡單、更簡潔的方式來聲明主要用於攜帶資料的類別。現在,透過新增模式比對和記錄 (JEP 406),這項改進在 Java 21 中得到了進一步增強。這項新功能允許使用模式匹配來測試某個值是否是 Record 類別的實例,並以更簡化的方式提取其元件。在本文中,我們將探討 Java 21 中模式匹配和記錄帶來的變化以及它如何使 Java 開發人員受益。
記錄作為資料的透明載體
Java 16 中引入的記錄是主要用於儲存和攜帶資料的類別。它們是透明的載體,這意味著它們的主要目的是保存數據,而所有其他功能(例如建構子、方法和 equals/hashCode 方法)都是由編譯器根據記錄中定義的資料欄位自動產生的。這使得它們非常適合在需要序列化或透過網路發送資料的場景中使用。
考慮定義兩個 X 和 Y 座標的 Line 類別的範例:
記錄 Line(int x, int y) {}
要使用此類,我們只需建立 Line 類別的實例並使用內建元件存取器方法 x() 和 y() 存取其資料欄位:
Line line = new Line(0, 10);
int x = line.x();
int y = line.y();
System.out.println("X: " + x + ", Y: " + y); // 輸出:X:0,Y:10
與記錄的模式相符
在 Java 21 中,加入了模式匹配,這使得可以測試某個值是否是 Record 類別的實例並以更簡化的方式提取其元件。在處理廣泛使用記錄的大型程式碼庫時,此功能特別有用。
考慮下面的範例,我們要測試一個物件是否是 Line 類別的實例並提取其組件:
靜態無效長度(物件 obj){
if (obj instanceof Line l) {
int x = l.x();
int y = l.y();
System.out.println(y-x);
}
}
如您所看到的,我們使用類型模式來測試該物件是否是 Point 的實例,如果是,我們就透過呼叫內建元件存取器方法來提取其元件。雖然此程式碼有效,但可以使用 Java 21 中的記錄模式進一步簡化它。
使用記錄模式,我們不僅可以測試一個值是否是 Record 類別的實例,還可以透過一行程式碼提取其元件。這是透過將提取的元件的局部變數宣告提升到模式本身中,並在值與模式匹配時呼叫訪問器方法來初始化這些變數來實現的。
考慮以下使用記錄模式的代碼:
靜態無效長度(物件 obj){
if (obj instanceof Line(int x, int y)) {
System.out.println(y-x);
}
}
這段程式碼更簡潔可讀。我們不再需要建立新物件並呼叫其元件存取器方法來取得資料。記錄模式直接為我們提取並初始化元件,讓我們的程式碼更加精簡。
嵌套記錄模式
開發人員面臨的主要挑戰之一是處理複雜的物件圖並從中提取資料。這就是模式匹配的真正威力所在,因為它允許我們優雅地擴展並匹配更複雜的物件圖。
考慮以下類別:Employee、Department(枚舉)和 Company(記錄)。我們可以使用記錄模式從 Company 物件中提取員工的部門:
// 從 Java 21 開始
static void printEmployeeDepartment(公司 c, 字串名稱) {
if (c instanceof Company(部門, List員工)) {
對於(員工 e:員工){
if (e.getName().equals(name)) {
System.out.println(name + " 位於 " + dept + " 部門。");
返回;
}
}
}
System.out.println(name + "未找到。");
}
在此範例中,我們使用巢狀模式從 Company 物件中提取 Employee 的部門。我們檢查給定的 Company 物件是否有部門和員工列表,然後循環列表以查找具有給定名稱的員工。如果找到該員工,我們會列印他們的部門。如果沒有,我們會列印一則訊息,指出未找到該員工。
중첩 패턴은 여러 값을 한 번에 일치시키고 분해하려는 상황에서도 사용할 수 있습니다. 주어진 좌표가 직사각형 내부에 있는지 확인하려는 다음 예를 고려하십시오.
//Java 21 기준
Point(double x, double y) 기록 {}
record Rectangle(Point upperLeft, Point lowerRight) {}
// 주어진 점이 주어진 직사각형 안에 있는지 확인
static boolean isPointInsideRectangle(Point p, Rectangle r) {
if (r 인스턴스of Rectangle(Point(var x1, var y1), Point(var x2, var y2))) {
if (p.x() > x1 && p.y() > y1 && p.x() < x2 && p.y() < y2) {
true를 반환합니다;
}
}
거짓을 반환;
}
이 예에서는 중첩 패턴을 사용하여 주어진 Point 객체가 주어진 Rectangle 객체의 경계 내에 속하는지 여부를 확인합니다. 중첩 패턴을 사용하면 여러 줄의 코드를 작성할 필요 없이 직사각형의 왼쪽 위 및 오른쪽 아래 지점의 x 및 y 좌표에 액세스할 수 있습니다.
결론적으로 Java 21에 패턴 일치 및 레코드(JEP 406)가 추가되면서 복잡한 객체에서 데이터를 처리하고 추출하는 방법이 크게 향상되었습니다. 이 기능은 코드를 크게 단순화하고 읽기 쉽고 간결하게 만듭니다. 또한 패턴 일치가 실패할 수 있는 실패 시나리오를 처리하는 데도 도움이 됩니다. 이러한 변경을 통해 Java 21은 계속해서 코드를 더욱 간소화하고 Java 개발자를 위한 개발 환경을 개선합니다.
MyExamCloud의 Java SE 21 개발자 전문 연습 시험을 통해 Java 21 기술을 업그레이드하세요. Java 21 전문가가 되기 위해 지식을 개발하고 테스트하세요.
以上是每個 Java 開發人員都必須了解的 Java 中的模式匹配和記錄變化的詳細內容。更多資訊請關注PHP中文網其他相關文章!