隨著Java 16 的發布,引入了Records (JEP 395) 帶來了重大改進,它允許以更簡單、更簡潔的方式來聲明主要使用的類別來承載數據。現在,透過新增模式比對和記錄 (JEP 406),這項改進在 Java 21 中得到了進一步增強。這個新功能允許使用模式匹配來測試某個值是否是 Record 類別的實例,並以更簡化的方式提取其元件。在本文中,我們將探討 Java 21 中模式匹配和記錄帶來的變化以及它如何使 Java 開發人員受益。
記錄作為資料的透明載體
Java 16 中引入的記錄是主要用於儲存和攜帶資料的類別。它們是透明的載體,這意味著它們的主要目的是保存數據,而所有其他功能(例如建構子、方法和 equals/hashCode 方法)都是由編譯器根據記錄中定義的資料欄位自動產生的。這使得它們非常適合在需要序列化或透過網路發送資料的場景中使用。
考慮定義兩個 X 和 Y 座標的 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 類別的實例並提取其組件:
static void length(Object obj) {
if (obj instanceof Line l) {
int x = l.x();
int y = l.y();
System.out.println(y-x);
}
}
如您所看到的,我們使用類型模式來測試該物件是否是 Point 的實例,如果是,我們就透過呼叫內建元件存取器方法來提取其元件。雖然此程式碼有效,但可以使用 Java 21 中的記錄模式進一步簡化它。
使用記錄模式,我們不僅可以測試一個值是否是 Record 類別的實例,還可以在一行程式碼中提取其元件。這是透過將提取的元件的局部變數宣告提升到模式本身中,並在值與模式匹配時呼叫訪問器方法來初始化這些變數來實現的。
考慮以下使用記錄模式的程式碼:
static void length(Object 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 開始
記錄點(雙 x, 雙 y) {}
記錄矩形(左上點,右下點){}
// 檢查給定點是否位於給定矩形內
static boolean isPointInsideRectangle(Point p, Rectangle r) {
if (r 矩形實例(Point(var x1, var y1), Point(var x2, var y2))) {
if (p.x() > x1 && p.y() > y1 && p.x()
返回真;
}
}
回傳錯誤;
}
在此範例中,我們使用巢狀模式來檢查給定的 Point 物件是否落在給定的 Rectangle 物件的範圍內。巢狀模式允許我們存取矩形左上角和右下角的 x 和 y 座標,而無需編寫多行程式碼。
總之,透過在 Java 21 中加入模式匹配和記錄 (JEP 406),我們在處理複雜物件和從複雜物件中提取資料的方式上有了顯著的改進。此功能極大地簡化了程式碼,使其更具可讀性和簡潔性。它還有助於處理模式匹配可能失敗的故障場景。透過這些更改,Java 21 繼續使程式碼更加精簡,並改善 Java 開發者的開發體驗。
透過 MyExamCloud 的 Java SE 21 開發人員專業練習測驗升級您的 Java 21 技能。發展並測試您的知識,成為 Java 21 專家。
以上是每個 Java 開發人員都必須了解的 Java 中的模式匹配和記錄變化的詳細內容。更多資訊請關注PHP中文網其他相關文章!