无涯教程- Java 14 – Record类型介绍
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
时,编译器会创建字节码,并在生成的类文件中包含以下内容:
- 接受所有字段的构造函数。
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);//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类型介绍相关推荐
- Java 14 新功能介绍!
Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...
- java八大基本类型介绍
//今天说一下java的八大基本类型: // 数字类型:byte(8位).short(16位).int(32位).long(64位) //浮点类型:float(32位).double(64位) ...
- java联接pg库_Java14:使用Java 14的新记录联接数据库表
java联接pg库 您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将 ...
- Java14:使用Java 14的新记录联接数据库表
您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中? 阅读这篇简短的文章,并了解如何使用Speedment Stream ORM完成它. 我们将从如何设置您的项目开 ...
- 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择
微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...
- java创建node类型数据类型_[Java教程]js DOM Node类型
[Java教程]js DOM Node类型 0 2015-12-18 16:00:08 DOM(文档对象模型)是针对HTML和 DOM可以将任何HTML或 以下面为例: My article Hell ...
- java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别
[Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...
- 无涯教程:Node.js - Streams介绍
无涯教程网:Stream流是使您可以连续地从源读取数据或将数据写入目标的对象,在Node.js中,有四种类型的流- Readable - 用于读取操作的流. Writable - 用于写 ...
- Java枚举类型介绍
简介 Java的枚举类型用于在某些东西可以枚举出来的时候,我们可以把它定义为枚举类型,然后把其中包含的可选值一一枚举.打个比方,我们现在有一堆数字,大致可以分为四种类型,整型.浮点型.金额和百分比.整 ...
最新文章
- 学术-数学:哥德巴赫猜想
- Mysql学习总结(5)——MySql常用函数大全讲解
- NIO和BIO如何影响应用程序的设计-API调用
- [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
- php资源文件html,nginx 同一域名下分目录配置显示php,html,资源文件
- IDEA自动编译不用每次make
- Maven打jar包的三种方式
- Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream
- NCBI安装影响因子插件
- 如何绕过百度网盘客户端下载大文件
- 四叉树与八叉树原理 / AABB OBB / 碰撞检测优化
- ssm整合shiro,activiti配置文件
- 电视家海信html安装不了,海信电视怎么安装电视家3.0
- 分享一个MySQL数据库表结构导出word文档最方便的方法
- SPI的读写GT21L字库芯片
- CSS的一个小案例——模拟soso搜搜导航器
- Windows AD证书服务系列---部署CA(2)
- seaborn palette参数各配色方案及显示效果
- 编程英语--youmay
- 区块链的分类与地址长度
热门文章
- 企业舆情监控机制,TOOM舆情分析企业舆情应对方法?
- 计算机课对小学生的作用,信息技术在小学教学中的重要性
- VO BO DAO DTO图解
- 判断二叉树是否为二叉搜索树
- 环保设备“云上查” 排污监管“线上盯”,EasyNVR助力智慧环保
- 项目管理:可视化表单界面设计器
- 网络实名制争议愈演愈烈是否推未知(转)
- Day228229.上传查询医院接口、上传查询删除科室接口、上传查询删除排班接口 -尚医通
- Chrome浏览器无法登录Google账号
- 国内外宽带性价比差距大 专家解析假宽带成因