Java中Record类型是Java 14中的预览函数引入的,并且应作为普通的 不可变 数据类,用于在类和应用程序之间进行数据传输。

Enum 一样,Record也是一个特殊的类输入Java。它旨在用于仅创建类以充当普通数据载体的地方。

类(Class)与记录(Record)之间的重要区别是,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使用

要创建一条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]

Record查看

当我们创建 EmployeeRecord时,编译器会创建字节码,并在生成的类文件中包含以下内容:

  1. 接受所有字段的构造函数。
  2. toString()方法,用于打印Record中所有字段的状态/值。
  3. 使用基于 invokedynamic 的机制的 equals() hashCode()方法。
  4. 其名称类似于字段名称的getter方法,即 id() firstName() lastName() email() age()
  5. 扩展了java.lang.Record ,它是所有Record的基类。这意味着Record不能扩展其他类。
  6. 该类被标记为 final ,这意味着我们无法创建它的子类。
  7. 它没有任何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);//2public java.lang.String toString();//3public final int hashCode();public final boolean equals(java.lang.Object);//4public java.lang.Long id();public java.lang.String firstName();public java.lang.String lastName();public java.lang.String email();public int age();
}

Record不能被继承

尽管所有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添加注释

我们可以为Record的组件添加注释,这些注释适用于它们。例如,我们可以将 @Transient 批注应用于 id 字段。

public record EmployeeRecord(@Transient Long id, String firstName, String lastName, String email, int age)
{//
}

Record序列

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字段和方法

添加到Record中的新字段必须为Static 静态 也可以添加一种方法,该方法可以访问Record字段的内部状态。

编译器不会在隐式生成的字节码中使用添加的字段和方法,因此它们不属于任何方法实现,例如 equals() hashCode() toString()。我们必须根据需要明确使用它们

public record EmployeeRecord(Long id, String firstName, String lastName, String email, int age) implements Serializable
{//additional fieldstatic boolean minor;//additional methodpublic String fullName() {return firstName + " " + lastName;}
}

Record构造函数

我们可以添加构造器特定代码,以在紧凑的构造器中进行数据验证。

我们不需要为字段指定构造函数参数的分配,因为它以通常的方式在规范构造函数中发生。

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");}}
}

来源:https://www.learnfk.com/article-java14-java-14-record-type

无涯教程- Java 14 – Record类型介绍相关推荐

  1. Java 14 新功能介绍!

    Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...

  2. java八大基本类型介绍

    //今天说一下java的八大基本类型:  // 数字类型:byte(8位).short(16位).int(32位).long(64位)  //浮点类型:float(32位).double(64位)   ...

  3. java联接pg库_Java14:使用Java 14的新记录联接数据库表

    java联接pg库 您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将 ...

  4. Java14:使用Java 14的新记录联接数据库表

    您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将从如何设置您的项目开 ...

  5. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  6. java创建node类型数据类型_[Java教程]js DOM Node类型

    [Java教程]js DOM Node类型 0 2015-12-18 16:00:08 DOM(文档对象模型)是针对HTML和 DOM可以将任何HTML或 以下面为例: My article Hell ...

  7. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别

    [Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...

  8. 无涯教程:Node.js - Streams介绍

    无涯教程网:Stream流是使您可以连续地从源读取数据或将数据写入目标的对象,在Node.js中,有四种类型的流- Readable   -  用于读取操作的流. Writable    -  用于写 ...

  9. Java枚举类型介绍

    简介 Java的枚举类型用于在某些东西可以枚举出来的时候,我们可以把它定义为枚举类型,然后把其中包含的可选值一一枚举.打个比方,我们现在有一堆数字,大致可以分为四种类型,整型.浮点型.金额和百分比.整 ...

最新文章

  1. 学术-数学:哥德巴赫猜想
  2. Mysql学习总结(5)——MySql常用函数大全讲解
  3. NIO和BIO如何影响应用程序的设计-API调用
  4. [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
  5. php资源文件html,nginx 同一域名下分目录配置显示php,html,资源文件
  6. IDEA自动编译不用每次make
  7. Maven打jar包的三种方式
  8. Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream
  9. NCBI安装影响因子插件
  10. 如何绕过百度网盘客户端下载大文件
  11. 四叉树与八叉树原理 / AABB OBB / 碰撞检测优化
  12. ssm整合shiro,activiti配置文件
  13. 电视家海信html安装不了,海信电视怎么安装电视家3.0
  14. 分享一个MySQL数据库表结构导出word文档最方便的方法
  15. SPI的读写GT21L字库芯片
  16. CSS的一个小案例——模拟soso搜搜导航器
  17. Windows AD证书服务系列---部署CA(2)
  18. seaborn palette参数各配色方案及显示效果
  19. 编程英语--youmay
  20. 区块链的分类与地址长度

热门文章

  1. 企业舆情监控机制,TOOM舆情分析企业舆情应对方法?
  2. 计算机课对小学生的作用,信息技术在小学教学中的重要性
  3. VO BO DAO DTO图解
  4. 判断二叉树是否为二叉搜索树
  5. 环保设备“云上查” 排污监管“线上盯”,EasyNVR助力智慧环保
  6. 项目管理:可视化表单界面设计器
  7. 网络实名制争议愈演愈烈是否推未知(转)
  8. Day228229.上传查询医院接口、上传查询删除科室接口、上传查询删除排班接口 -尚医通
  9. Chrome浏览器无法登录Google账号
  10. 国内外宽带性价比差距大 专家解析假宽带成因