天天看點

jdk17新特性之Records詳解

作者:Edwin2802

Records介紹

Java 17中引入了一項新特性:Records(記錄類型),它是一種輕量級的類類型,旨在簡化資料對象的建立和通路。與傳統的Java類不同,Records具有以下特點:

  1. Records是一種不可變類,它的成員變量一旦被指派,就不能再被修改。
  2. Records可以自動生成構造函數、getter方法、equals方法、hashCode方法和toString方法,這些方法都是根據Records的成員變量自動生成的。
  3. Records可以顯式定義構造函數和方法。
  4. 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還支援的特性:

  1. 顯式定義構造函數
public record Person(String name, int age) {
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}           
  1. 顯式定義方法

可以在Record類中添加自定義方法。例如,我們可以在上述代碼中添加一個擷取年齡的方法:

public record Person(String name, int age) {
    public int getAge() {
        return age;
    }
}           

這樣就可以通過以下代碼來擷取Person對象的年齡:

Person person = new Person("張三", 18);
int age = person.getAge(); // 傳回18           
  1. 繼承其他類或實作接口
public interface HasId {
    long id();
}

public record Person(String name, int age, long id) implements HasId {
}           

優點:

  1. 簡化代碼:Records可以自動生成構造函數、getter方法、equals方法、hashCode方法和toString方法,使得代碼量大大減少。
  2. 不可變性:Records是一種不可變類,它的成員變量一旦被指派就不能再被修改,這有助于減少程式出錯的機率,提高程式的可讀性和可維護性。
  3. 易于使用:Records的文法非常簡單,使用者無需關注底層實作細節,隻需要關注業務邏輯的實作。
  4. 線程安全:由于Records是不可變類,是以具有更好的線程安全性和可靠性。

缺點:

  1. 功能受限:Records隻能表示一些簡單的資料對象,如果需要表示更複雜的對象,可能需要使用傳統的Java類。
  2. 不支援繼承:Records不支援繼承其他類,這意味着如果需要進行繼承操作,可能需要使用傳統的Java類。

适用場景:

  1. 資料傳輸對象(DTO):Records非常适合用于表示資料傳輸對象,它可以快速建立簡單的資料對象,并且具有良好的可讀性和可維護性。
  2. 值對象(VO):Records也非常适合用于表示值對象,例如顔色、日期、位址等值對象。
  3. 不可變對象:由于Records是不可變類,是以非常适合用于表示不可變對象,例如貨币、價格等對象。

總的來說,Records是一項非常實用的功能,它可以幫助開發者更加專注于業務邏輯的實作,而無需關心資料對象的細節,适用于表示簡單的資料對象和不可變對象。

繼續閱讀