JDK14 新增關鍵字——record

FunTester發表於2024-04-26

簡介

JDK 14 引入了記錄,這是一種新的型別宣告。像 enum 一樣,記錄是類的受限形式。它非常適合於純資料載體,即包含不打算更改的資料並且只包含最基本的方法(如建構函式和訪問函式)的類。

注意:這是一個預覽功能,它的設計、規範和實現都是完整的,但不是永久性的,這意味著該功能可能以不同的形式存在,或者在未來的 JDK 版本中根本不存在。若要編譯和執行包含預覽功能的程式碼,必須指定其他命令列選項。

下面是一個普通的 Java 類:

final class FunTester {

    final String name;

    final int age;

    public FunTester(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String name() {
        return name;
    }

    public int age() {
        return age;
    }

}

它具有以下特點:

  • 它的所有成員都被宣佈為最終成員
  • 它唯一的方法包括一個建構函式和兩個訪問屬性的方法

我們可以用一個 record 來替換這個類:

record FunTester(String name, int age) { }

record 有以下幾個特點:

  • 每個元件的私有 final 欄位。
  • 每個元件的公共讀訪問器方法,方法名與屬性名一致。
  • 一個公共建構函式,其簽名從記錄元件列表中派生。
  • equals()hashCode() 方法的實現,如果兩個 record 物件屬於同一型別且其對應的記錄屬性相等,則指定這兩個記錄相等。
  • toString() 方法的一個實現件的字串表示及其名稱。

緊湊型建構函式

如果我們想記錄的建構函式不僅僅是初始化屬性值,那麼可以為記錄定義一個自定義建構函式。然而,與類建構函式不同,記錄建構函式沒有正式的引數列表;這被稱為緊湊建構函式。

例如,下面的 record FunTester ,我們想在建構函式里面校驗屬性值,可以用下面這種語法,雖然我們沒有顯式寫出賦值程式碼,但是這些程式碼實際是會生效。

record FunTester(String name, int age) {
    public FunTester {
        if (age < 0) {
            throw new IllegalArgumentException("年齡不能為負數");
        }
        Objects.requireNonNull(name, "名字不能為空");
    }
}

record 的限制

以下是對 record 使用的限制:

  • record 不能擴充套件任何類
  • final記錄不能宣告例項欄位;任何其他宣告的欄位必須是 static
  • record 不能是抽象的;他們隱含地final
  • record 的屬性是 final

除了這些限制之外,記錄的行為與常規類相同。除此之外 java.lang.Class 有兩個與記錄相關的新方法:

  • RecordComponent[] getRecordComponents():返回一個陣列 java.lang.reflect.RecordComponent 物件,對應於記錄的元件。
  • boolean isRecord():與此類似 ,只是如果類被宣告為記錄則 isEnum()返回。true

演示程式碼如下:

public static void main(String[] args) {  
    FunTester fun = new FunTester("FunTester", 25);// 建立record物件  
    boolean record = fun.getClass().isRecord();// 判斷是否是record  
    System.out.println(record);// true  
    RecordComponent[] recordComponents = fun.getClass().getRecordComponents();// 獲取所有的元件  
    for (RecordComponent recordComponent : recordComponents) {  
        System.out.println(recordComponent.getName());// name, age  
    }  
}
  • 2021 年原創合集
  • 2022 年原創合集
  • 2023 年原創合集
  • 服務端功能測試
  • 效能測試專題
  • Java、Groovy、Go、Python
  • 單元&白盒&工具合集
  • 測試方案&BUG&爬蟲&UI 自動化
  • 測試理論雞湯
  • 社群風采&影片合集
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。