Records介紹
Java 17中引入了一項新特性:Records(記錄類型),它是一種輕量級的類類型,旨在簡化資料對象的建立和通路。與傳統的Java類不同,Records具有以下特點:
- Records是一種不可變類,它的成員變量一旦被指派,就不能再被修改。
- Records可以自動生成構造函數、getter方法、equals方法、hashCode方法和toString方法,這些方法都是根據Records的成員變量自動生成的。
- Records可以顯式定義構造函數和方法。
- Records可以繼承其他類或實作接口。
Records的主要目的是簡化Java開發中常見的資料對象的建立和通路。傳統的Java類通常需要手動編寫構造函數、getter方法、equals方法、hashCode方法和toString方法,這些代碼量很大,而且容易出錯。Records的出現可以讓開發者更加專注于業務邏輯的實作,而無需關心資料對象的細節。
與其他語言中的類似功能相比,Records的優勢在于它是一種Java語言級别的特性,可以充分利用Java語言的類型系統和類型檢查機制。另外,由于Records是一種不可變類,它具有更好的線程安全性和可靠性,可以有效避免多線程環境下的競态條件問題。
代碼示例:
下面我們通過一個代碼示例來詳細介紹Records的用法:
public record Person(String name, int age) {
// 可以在這裡添加自定義方法
}
上述代碼定義了一個名為Person的Record類,其中包含了兩個屬性name和age。需要注意的是,Record類的屬性必須在構造函數中初始化,并且一旦初始化後就不能再修改。是以,Record類的執行個體是不可變的。
下面我們可以通過以下代碼來建立一個Person對象:
Person person = new Person("張三", 18);
這樣就建立了一個名為張三、年齡為18歲的Person對象。需要注意的是,Record類的構造函數是自動生成的,并且支援使用屬性名來初始化屬性。例如,在上述代碼中,我們可以使用以下方式來建立Person對象:
Person person = new Person(name: "張三", age: 18);
這樣可以讓代碼更加易讀。
除了自動生成的構造函數以外,Records還為我們自動生成了equals方法、hashCode方法和toString方法。例如,在上述代碼中,我們可以直接使用以下代碼來比較兩個Person對象是否相等:
Person person1 = new Person("張三", 18);
Person person2 = new Person("張三", 18);
boolean result = person1.equals(person2); // 傳回true
需要注意的是,Records生成的equals方法會比較所有的屬性值,是以隻有當兩個Record對象的所有屬性值都相等時,equals方法才會傳回true。
另外,Records還支援的特性:
- 顯式定義構造函數
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
}
- 顯式定義方法
可以在Record類中添加自定義方法。例如,我們可以在上述代碼中添加一個擷取年齡的方法:
public record Person(String name, int age) {
public int getAge() {
return age;
}
}
這樣就可以通過以下代碼來擷取Person對象的年齡:
Person person = new Person("張三", 18);
int age = person.getAge(); // 傳回18
- 繼承其他類或實作接口
public interface HasId {
long id();
}
public record Person(String name, int age, long id) implements HasId {
}
優點:
- 簡化代碼:Records可以自動生成構造函數、getter方法、equals方法、hashCode方法和toString方法,使得代碼量大大減少。
- 不可變性:Records是一種不可變類,它的成員變量一旦被指派就不能再被修改,這有助于減少程式出錯的機率,提高程式的可讀性和可維護性。
- 易于使用:Records的文法非常簡單,使用者無需關注底層實作細節,隻需要關注業務邏輯的實作。
- 線程安全:由于Records是不可變類,是以具有更好的線程安全性和可靠性。
缺點:
- 功能受限:Records隻能表示一些簡單的資料對象,如果需要表示更複雜的對象,可能需要使用傳統的Java類。
- 不支援繼承:Records不支援繼承其他類,這意味着如果需要進行繼承操作,可能需要使用傳統的Java類。
适用場景:
- 資料傳輸對象(DTO):Records非常适合用于表示資料傳輸對象,它可以快速建立簡單的資料對象,并且具有良好的可讀性和可維護性。
- 值對象(VO):Records也非常适合用于表示值對象,例如顔色、日期、位址等值對象。
- 不可變對象:由于Records是不可變類,是以非常适合用于表示不可變對象,例如貨币、價格等對象。
總的來說,Records是一項非常實用的功能,它可以幫助開發者更加專注于業務邏輯的實作,而無需關心資料對象的細節,适用于表示簡單的資料對象和不可變對象。