java记录类型_Java中的记录类型

java记录类型

于2020年3月发布的JDK 14引入了记录 (预览语言功能),该记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访问器和通用方法,例如equals()hashCode()toString()都是根据记录的状态描述自动得出的。

先决条件

您将需要启用了预览功能的JDK 14。

了解如何使用SDKMAN管理多个Java SDK! 轻松

我们将

记录申报

记录具有名称和状态描述。 状态描述声明记录组成部分 ,并可选地声明主体:

 record Owner(String name, String address, String city, String telephone) {}  record PetType(String name) {}  record Pet(LocalDate birthDate, PetType type, Owner owner) {} 

记录的表示是通过以下成员从状态描述中机械而完全地得出的:

  • 每个组件的private final字段
  • 每个组件的public读取访问器方法,其名称和类型与该组件相同(例如owner.name()owner.address()
  • public建设者
  • equals()hashCode()
  • toString()的实现。

下面的测试演示了基本行为:

 class Java14RecordTests { @Test void recordAccessors() { var owner = new Owner( "John Doe" , "110 W. Liberty St." , "Madison" , "6085551023" ); assertThat(owner.name()).isEqualTo( "John Doe" ); assertThat(owner.address()).isEqualTo( "110 W. Liberty St." ); assertThat(owner.city()).isEqualTo( "Madison" ); assertThat(owner.telephone()).isEqualTo( "6085551023" ); } @Test void recordEqualsAndHashCode() { var pet1 = new Pet( LocalDate.of( 2019 , 1 , 1 ), new PetType( "dog" ), new Owner( "John Doe" , null , null , null ) ); var pet2 = new Pet( LocalDate.of( 2019 , 1 , 1 ), new PetType( "dog" ), new Owner( "John Doe" , null , null , null ) ); assertThat(pet1).isEqualTo(pet2); assertThat(pet1.hashCode()).isEqualTo(pet2.hashCode()); } @Test void recordToString() { var pet = new PetType( "dog" ); assertThat(pet.toString()).isEqualTo( "PetType[name=dog]" ); }  } 

限制条件

记录是类的一种受限形式,其限制是:

  • 记录不能扩展任何其他类别
  • 声明的任何其他字段必须为静态
  • 记录的组成部分是隐式最终的

额外行为

除上述限制外, 记录的行为类似于常规类,并且:

  • 记录可以声明实例和静态方法,静态字段,静态初始化程序:
 record Owner(String name, String address, String city, String telephone) { /* Static initializer */ static { NONE = "N/A" ; } /* Static fields are allowed, both private and public */ private static String NONE; /* Records may have static methods */ public static Owner anOwner(String name) { return new Owner(name, NONE, NONE, NONE); }  } 
  • 记录可以声明构造函数,也可以声明紧凑构造函数。 紧凑的构造函数可以访问记录的组件:
 record Pet(LocalDate birthDate, PetType type, Owner owner) { /* `Compact` constructor */ public Pet { "birthDate" requiresNotNull( "birthDate" , birthDate); requiresNotNull( "type" , type); requiresNotNull( "owner" , owner); }     public Pet(LocalDate birthDate, PetType type) { this (birthDate, type, null ); } /* Records may have instance methods */ private void requiresNotNull(String name, Object obj) { if (Objects.isNull(obj)) { throw new IllegalArgumentException(name + " can't be null" ); } }  } 
  • 记录可以覆盖所有标准方法: equals()hashCode()toString()
  • 记录可以实现接口
  • 记录可以注释

… 和更多。

源代码

可以在Github上找到本文的源代码: https : //github.com/kolorobot/java9-and-beyond

参考资料

  • https://openjdk.java.net/jeps/359

翻译自: https://www.javacodegeeks.com/2020/05/record-type-in-java.html

java记录类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理模式(多线程实现状态监控)

【-1】README-1.1)本文部分文字描述转自“head first 设计模式”,旨在学习 远程代理对象 的基础知识;-1.2)多线程实现糖果自动售卖机监控程序为原创;-1.3)博文最后,转载了代理模式的定义&#…

一篇文章搞定面试中的二叉树

转载自 IOExceptioner 算法与数据结构 在上一篇介绍二叉树( Android面试题算法之二叉树 、红黑树详细分析,看了都说好),没看的读者建议先去了解了解,接下来再给大家带来一篇关于二叉树的文章。 最近总结了一些数据结…

清洁代码_清洁单元测试

清洁代码编写使用JUnit和某些模拟库的“单元测试”测试很容易。 即使测试甚至不是单元测试并提供可疑的价值,它们也可能产生使某些涉众满意的代码覆盖范围。 编写单元测试(在理论上是单元测试,但是比基础代码更复杂)因此也很容易编…

jvm(6)-Class字节码文件结构总结

【0】README 0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构; 【1】干货开始 对上图的分析(Analysis):A1)offset0 A1.1)头四个字节为CAFEBABE:表示…

Android面试题算法之二叉树

转载自 qing的世界 程序员小乐文章目录 前言二叉树的递归(深度优先)处理二叉树的层序处理(广度优先)总结“一、前言今年可谓是跌宕起伏的一年,幸好结局还算是圆满。开年的时候由于和公司CTO有过节,被"打入冷宫"&#…

java 读取 文本块_Java文本块

java 读取 文本块文本块是JDK增强建议( JEP 355 ),可以在JDK 13和14中用作预览语言功能。它计划在JDK 15中成为永久性功能。文本块是跨越多行并且不需要的String文字。对于大多数转义序列。 动机 在标准Java字符串中嵌入XML,JSON…

代理模式之虚拟代理(仅了解)

【0】README0.1)本文全文转自 “head first 设计模式”,旨在了解 虚拟代理动态代理;0.2)晚辈我 java.swing 烂到渣,没有写出干货荔枝,抱歉;【1】虚拟代理简述1)远程代理:…

红黑树详细分析

转载自 coolblog 算法与数据结构“一、红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert…

rest api如何创建_REST:创建资源

rest api如何创建资源创建是常见的REST API操作。 在这篇文章中,我们将看到如何创建单个资源。 客户要求 通常,通过将POST请求发送到父集合资源来创建资源。 这将使用新生成的ID创建一个新的下属资源。 例如,对/ projects的POST请求可用于在…

java字节码指令简介(仅了解)

【0】README0.1)本文全文转自 “深入理解jvm”, 旨在了解 java字节码指令 的基础知识;【1】写在前面1)由于jvm 采用面向操作数栈而不是寄存器的结构,所以大多数的指针都不包含操作数,只有一个操作码&#x…

什么是 CAS 机制

转载自 永远爱大家的 程序员小灰示例程序:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果是什么呢?一定会是200吗?加了同步锁之后,count自增的操作变成了原子性操作,所以最终…

java xmpp_Java XMPP负载测试工具

java xmpp在本文中,我们将开发用Java编写的XMPP负载测试工具。 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1。 创建一个新的Maven项目 4.2。 创建主类 4.3。 XmppManager类 4.4。 建立 4.5。 负载测试 5.总结 6.参考 7.下载Maven项目…

jvm(7)-虚拟机类加载机制

【0】README0.1)本文转自“深入理解jvm”,旨在学习 虚拟机类加载机制 的基础知识;【1】概述1)类加载机制:虚拟机把描述类的数据从Class 文件加载到内存,并对数据进行校验,转换解析和初始化&…

什么是CAS机制?(进阶篇)

转载自 永远爱大家的 程序员小灰 这一期我们来深入介绍之前遗留的两个问题: Java当中CAS的底层实现 CAS的ABA问题和解决方法 首先看一看AtomicInteger当中常用的自增方法 incrementAndGet: public final int incrementAndGet() {for (;;) {int cur…

c++ 前缀 变量命名_前缀命名

c 前缀 变量命名如果您是第一次查看Takes或Cactoos的源代码,很可能会像其他命名约定一样被命名约定触发,这意味着大多数类名都有两个字母的前缀: BkSafe , RqFake , RsWithStatus , TkGzip等。 老实说&…

jvm(8)-虚拟机字节码执行引擎

【0】README0.1)本文转自 “深入理解jvm”,旨在学习 虚拟机字节码执行引擎 的基础知识;【1】概述1)物理机和虚拟机的执行引擎: 物理机的执行引擎是直接建立在处理器,硬件,指令集和操作系统层面上…

什么是大数据

转载自 玻璃猫 程序员小灰大数据是具有海量、高增长率和多样化的信息资产,它需要全新的处理模式来增强决策力、洞察发现力和流程优化能力。Big data is high volume, high velocity, and/or high variety information assets that require new forms of processing…

java 记录考勤记录_Java 14:记录

java 记录考勤记录Java 14是在几周前问世的,它引入了Record类型,它是一个不变的数据载体类,旨在容纳一组固定的字段。 请注意,这是一种预览语言功能 ,这意味着必须使用--enable-preview标志在Java编译器和运行时中显式…

漫画:什么是HashMap

转载自 玻璃猫 程序员小灰众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 HashMap数组每一个元素的初始值都…

jvm(10)-早期(编译期)优化

【0】README 0.1)本文部分文字描述转自 “深入理解jvm”,旨在学习 早期(编译期)优化 的基础知识; 0.2)本文部分文字描述转自: http://www.cnblogs.com/zhouyuqin/p/5223180.html 【1】概述 …