為什麼多出 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 |
|---|---|---|
| 可變性 | 不可變 | 可變 |
| 繼承 | 不可繼承 | 可繼承 |
| 樣板程式碼 | 少 | 多 |
| 用途 | 資料載體 | 一般用途 |
