「原創宣告:保留所有權利,禁止轉載」
簡介
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 自動化
- 測試理論雞湯
- 社群風采&影片合集
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。