您好,登錄后才能下訂單哦!
本篇內容主要講解“Java 14中Record類型的介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java 14中Record類型的介紹”吧!
Java中Record類型是Java 14中的預覽函數引入的,并且應作為普通的 不可變 數據類,用于在類和應用程序之間進行數據傳輸。
像Enum
一樣,Record也是一個特殊的類輸入Java。它旨在用于僅創建類以充當普通數據載體的地方。
類(Class)與記錄(Record)之間的重要區別是,Record旨在消除設置和從實例獲取數據所需的所有代碼,Record將這種責任轉移給生成編譯器。
我們可以在 record
定義中覆蓋上面提供的任何默認方法,以實現自定義行為。
使用關鍵字 record
在Java中創建此類Record類。就像我們在構造函數中所做的一樣,我們需要在Record中提及屬性及其類型。
在給定的示例中, EmployeeRecord
用于保存員工信息,即
package com.howtodoinjava.core.basic; public record EmployeeRecord(Long id, String firstName, String lastName, String email, int age) { }
要創建一條Record,請調用其構造函數并在其中傳遞所有字段信息。然后,我們可以使用JVM生成的getter方法獲取記錄信息,并調用任何生成的方法。
package com.howtodoinjava.core.basic; public class RecordExample { public static void main(String[] args) { EmployeeRecord e1 = new EmployeeRecord (1l, "Lokesh", "Gupta", "howtodoinjava@gmail.com", 38); System.out.println(e1.id()); System.out.println(e1.email()); System.out.println(e1); } }
程序輸出:
1 howtodoinjava@gmail.com EmployeeRecord[id=1, firstName=Lokesh, lastName=Gupta, email=howtodoinjava@gmail.com, age=38]
當我們創建 EmployeeRecord
時,編譯器會創建字節碼,并在生成的類文件中包含以下內容:
接受所有字段的構造函數。
toString()
方法,用于打印Record中所有字段的狀態/值。
使用基于 invokedynamic
的機制的 equals()
和 hashCode()
方法。
其名稱類似于字段名稱的getter方法,即 id()
, firstName()
, lastName()
, email()
和 age()
。
類擴展了java.lang.Record
,它是所有Record的基類。這意味著Record不能擴展其他類。
該類被標記為 final
,這意味著我們無法創建它的子類。
它沒有任何setter方法,這意味著Record實例被設計為不可變的。
如果在生成的類文件上運行 javap
工具,我們將看到該類文件。
public final class com.howtodoinjava.core.basic.EmployeeRecord extends java.lang.Record { //1 public com.howtodoinjava.core.basic .EmployeeRecord(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, int); //2 public java.lang.String toString(); //3 public final int hashCode(); public final boolean equals(java.lang.Object); //4 public java.lang.Long id(); public java.lang.String firstName(); public java.lang.String lastName(); public java.lang.String email(); public int age(); }
盡管所有Record都擴展了 java.lang.Record
類,但是我們仍然不能顯式創建 java.lang.Record
的子類。編譯器不會通過。
final class Data extends Record { private final int unit; } // Compiler error : The type Data may not subclass Record explicitly
這意味著獲取Record的唯一方法是顯式聲明一個Record并讓 javac
創建類文件。
我們可以為Record的組件添加注釋,這些注釋適用于它們。例如,我們可以將 @Transient
批注應用于 id
字段。
public record EmployeeRecord( @Transient Long id, String firstName, String lastName, String email, int age) { // }
Record類的 serialVersionUID
是 0L
,除非它是明確聲明。
Record對象序列化的過程無法自定義;Record類定義的任何特定于類的代碼 writeObject,readObject,readObjectNoData,readResolve,writeExternal和readExternal方法在序列化和反序列化期間都將被忽略。但是,writeReplace方法可用于返回要序列化的替代對象。
在執行任何 序列化或反序列化之前,我們必須確保Record必須可序列化或可外部化。
import java.io.Serializable; public record EmployeeRecord ( Long id, String firstName, String lastName, String email, int age) implements Serializable { }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class RecordExample { public static void main(String[] args) { EmployeeRecord e1 = new EmployeeRecord (1l, "Lokesh", "Gupta", "howtodoinjava@gmail.com", 38); writeToFile(e1, "employee1"); System.out.println(readFromFile("employee1")); } static void writeToFile(EmployeeRecord obj, String path) { try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(path))){ oos.writeObject(obj); } catch (IOException e) { e.printStackTrace(); } } static EmployeeRecord readFromFile(String path) { EmployeeRecord result = null; try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))){ result = (EmployeeRecord) ois.readObject(); } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); } return result; } }
程序輸出:
EmployeeRecord[id=1, firstName=Lokesh, lastName=Gupta, email=howtodoinjava@gmail.com, age=38]
添加到Record中的新字段必須為Static 靜態 也可以添加一種方法,該方法可以訪問Record字段的內部狀態。
編譯器不會在隱式生成的字節碼中使用添加的字段和方法,因此它們不屬于任何方法實現,例如 equals()
, hashCode()
或 toString()
。我們必須根據需要明確使用它們。
public record EmployeeRecord( Long id, String firstName, String lastName, String email, int age) implements Serializable { //additional field static boolean minor; //additional method public String fullName() { return firstName + " " + lastName; } }
我們可以添加構造器特定代碼,以在緊湊的構造器中進行數據驗證。
我們不需要為字段指定構造函數參數的分配,因為它以通常的方式在規范構造函數中發生。
public record EmployeeRecord( Long id, String firstName, String lastName, String email, int age) implements Serializable { public EmployeeRecord { if(age < 18) { throw new IllegalArgumentException( "You cannot hire a minor person as employee"); } } }
到此,相信大家對“Java 14中Record類型的介紹”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。