Java Record

      在〈Java Record〉中尚無留言

為什麼多出 record

傳統的物件導向寫法,需要在建構子把傳入的區域變數轉成物件變數,然後再撰寫 getter/setter 方法,如下所示。

public class Record {
    public static void main(String[] args) {
        Person p=new Person("Thomas", 30, true);
        System.out.println(p.name());
        System.out.println(p.age());
        System.out.println(p.sex());
    }
}
class Person{
    final String name;
    final int age;
    final boolean sex;
    public Person(String name, int age, boolean sex){
        this.name=name;
        this.age=age;
        this.sex=sex;
    }
    public String name(){return name;}
    public int age(){return age;}
    public boolean sex(){return sex;}
}

Java 16 正式引入 Record,是一種簡潔的方式來建立不可變的資料類別,可以把上述藍色部份的程式碼整個省略掉,另外還自動加入其它方法。

基本語法

🔒 完整內容請註冊並登入會員。

免費註冊登入

Record 自動提供

Record 會自動產生:

  • 所有欄位的 getter 方法(沒有 get 前綴)
  • equals() 方法
  • hashCode() 方法
  • toString() 方法
  • 全參數建構子 Canonical Constructor

等同於傳統類別

🔒 完整內容請註冊並登入會員。

免費註冊登入

物件變數

record 會自動新增所有欄位的 final 物件變數,但不可以手動指定其它物件變數,只能新增 static 變數。

🔒 完整內容請註冊並登入會員。

免費註冊登入

Canonical Constructor

Canonical [kəˈnɒnɪkl] 中文稱為全參數建構子,record 會自動建立如下建構子,手動撰寫也可以,只是多此一舉。

🔒 完整內容請註冊並登入會員。

免費註冊登入

Compact Constructor

Compact Constructor 中文稱為緊湊建構子,是全參數建構子的精簡語法,建構子不需加入參數,也不需要 ()。

🔒 完整內容請註冊並登入會員。

免費註冊登入

Compact 及 Canonical 只能二選一,不可以兩者併存

上述 Compact 建構子的最後一行 name = name.trim(); ,在離開建構子後,系統會自動加入如下二行。而且請注意,不可以手動寫那二行。

🔒 完整內容請註冊並登入會員。

免費註冊登入

自訂建構子

record 的非 Canonical 建構子(non-canonical constructor)必須透過 this(…) 呼叫另一個建構子,最終導向 Canonical Constructor。

🔒 完整內容請註冊並登入會員。

免費註冊登入

final class

record 產生的類別為 final class,所以無法產生子類別。

record Person(int age, String name){}
//Person 無法讓 Man 繼承
/*
class Man extends Person{}
*/

新增方法

🔒 完整內容請註冊並登入會員。

免費註冊登入

實作介面

🔒 完整內容請註冊並登入會員。

免費註冊登入

Record 總結

  • 所有欄位都是 final(不可變)
  • 不能繼承其他類別
  • 不能宣告實例變數
  • 是 final 類別,不能被繼承

實際應用

DTO(資料傳輸物件)

🔒 完整內容請註冊並登入會員。

免費註冊登入

複合鍵

🔒 完整內容請註冊並登入會員。

免費註冊登入

回傳多個值

現今常見的程式語言中,所謂回傳多個值其實只是方便的說法。嚴格來說,函數執行後產生的是一個回傳結果,如果需要傳遞多個資料,通常是先將這些資料封裝成某種資料結構,再將這個資料結構回傳。無論是 Python 或是 Java 都是透過這種方式來處理。

請看完如下的例子即可明白。

🔒 完整內容請註冊並登入會員。

免費註冊登入

上述的作法是把「多個值」塞進 MinMax 物件,然後傳回 MinMax 物件。而 MinMax 物件裏有 min()、max() 二個方法,再於調用端調用所需的方法。

設定類別

🔒 完整內容請註冊並登入會員。

免費註冊登入

Record 和模式匹配 (Java 19+)

🔒 完整內容請註冊並登入會員。

免費註冊登入

Record vs Class

特性 Record Class
可變性 不可變 可變
繼承 不可繼承 可繼承
樣板程式碼
用途 資料載體 一般用途

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *