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

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

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

相关文章

山东省102021年普通高考成绩查询,山东高考成绩今日发布!成绩查询看这里!

原标题:山东高考成绩今日发布!成绩查询看这里!山东高考生注意啦~今天16:20举行山东2020年夏季高考第二次新闻发布会届时将会公布高考录取政策、分数线情况等今天17:00公布2020夏季高考与等级考成绩发布会怎么看?高考成绩怎样查&am…

使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分

在本系列的第一篇文章中,我们创建了一个基本的身份验证服务,以使用SoapUI进行调用。 因此,在第二篇文章中,我们将逐步演示如何使用此工具成功调用这种服务。 使用SoapUI的1-Basic WCF SOAP –创建新的SOAP项目 首先,我…

html table nei边框线,GitHub - meichuanneiku/TableCell: 在TableBank的基础上,进一步标注到单元格精度,利用目标检测/分割实现单元格定位。...

项目说明本项目是我2019年7月份的实习工作的**展示与记录**:把倾斜的表格旋转水平;制作5000张表格数据集,需要标注每一个单元格,并实现单元格检测第一项比较简单,仿射变换、透视变换已经很成熟了,关键是第二…

前缀命名

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

再访PMML

嗨伙计! 从今年年初开始,就有了重新设计Drools PMML模块的计划。 在这篇文章中,我将描述我们将如何处理它,目前的状态,未来发展的想法等,等等……敬请期待! 背景 PMML是一个标准,旨…

用计算机怎么弹离人愁数字,拇指琴新手入门曲谱——离人愁

喜欢古风的朋友赶快凑过来啦,最近抖音上超火的离人愁拇指琴教学,喜欢离人愁的小姐姐小哥哥赶快学起来啦!以下琴谱适用于Hugh Tracey G调17键。南非琴出厂调音是G调排列,习惯了C调音阶排列的朋友可能对G调排列不是很适应。因为两者…

jvm7 jvm8_JVM PermGen –您在哪里?

jvm7 jvm8这篇文章介绍了JVM内存结构的一些基础知识,并快速窥视了PermGen,以了解自Java SE 8出现以来它已消失的地方。 裸基础 JVM只是系统上运行的另一个进程,魔术始于java命令。 像任何OS进程一样,它需要内存才能运行。 请记住…

C++类与对象(中)第二篇

前言: C语言中使用运算符是对内置类型的数据进行操作,但是在C中有了对象,导致对象无法通过运算符进行运算,故引入了运算符重载即需要重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特…

ETL万岁

提取转换负载是用于从一个数据系统中提取数据并加载到另一个数据系统中的过程。 涉及的数据系统称为源系统和目标系统。 来自源系统的数据形状与目标系统不匹配,因此需要进行一些转换以使其兼容,该过程称为Transformation 。 转换是由map / filter / re…

云计算机内存不足怎么办,网易云音乐提示内存不足,电脑提示内存不足-

在有些时候我们的手机百度云提示内存不足了,这该怎么办呢?那么下面就由学习啦小编来给你们说说手机百度云提示内存不足的解决方法吧,希望可以帮到你们哦!手机百度云提示内存不足的解决方法一:手机用久了,需要安装杀毒软件&#x…

getter/setter_Getters / Setters。 邪恶。 期。

getter/setter从2003年开始,艾伦霍鲁布(Allen Holub)讨论了为什么吸气和塞特方法是邪恶的著名文章,关于吸气/塞特方法是否是反模式,应该避免使用,还是我们在面向对象中不可避免地需要它,这是一个…

Java / Spring:如何快速生成整个Swagger记录的CRUD REST API

作为开发人员,我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档。 无论我们的文档只有几行来解释功能的核心功能,还是表明系统的来龙去脉的成熟文章都没关系。 重要的是,我们试图通过文档传达的信息是准确且可理解的…

中的实践 中兴_中兴通讯5G智慧治水业务在千岛湖畔下姜村成功实践

近日,中兴通讯智慧治水业务在千岛湖畔下姜村成功实践。这一业务为实现千岛湖下姜村水域的智能化管理、立体化监控提供了可靠保障,也将浙江电信5G网络、中兴通讯5G端到端解决方案在试商用实践中再推进一步。下姜村曾先后获得“全国创先争优先进基层党组织…

一加7充电_一加真无线耳机曝光,65W快速充电器获认证

一加8系列发布后,曾有消息显示,一加旗下还有一款被称为一加Z的手机将于今年7月登陆市场。现在,距离传言中提到的发布时间越来越近,也再次有消息提到了这一时间点。不过,这次爆料中的新品并不是手机产品。来自爆料人士 …

从工作中清除代码–使用JUnit 5,Mockito和AssertJ编写可执行规范

可执行规范是可以用作设计规范的测试。 通过启用公共语言(在DDD世界中,这也称为无处不在的语言 ),它们使技术和业务团队能够进入同一页面。 它们充当代码的未来维护者的文档。 在本文中,我们将看到一种编写自动测试的…

家用计算机注意哪些参数,电脑小白买内存条要注意哪些?主要看哪些参数?这些知识要掌握...

内存条是电脑的核心硬件之一,它的作用主要是为CPU服务的,电脑运行的时候,CPU从硬盘里调用数据通过总线寻址放在内存里,内存相当于缓冲处理区,处理好信息后再回馈给CPU,然后电脑再根据指令运行。内存没有记忆…

日照职业技术学院计算机怎么样,日照职业技术学院宿舍条件怎么样 住宿环境好不好...

又到了一年一度的新生入学季,今年考上日照职业技术学院的学子们对你们的新学校有没有期待?下文中有途网小编给大家整理了日照职业技术学院的宿舍环境,供参考!日照职业技术学院宿舍环境如何大学宿舍是各位同学们在大学期间会陪伴我…

cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!

蛋糕胚速学教程大全,适合初学者看哦!烘焙蛋糕最难的还是装饰,对手残星人来说,好不容易切好了蛋糕胚,抹面费了老大劲还是凹凸不平,做出来像狗狗啃过似的~快来看这份蛋糕抹面技巧,教你…

计算机一级上机考试试题题库,2016年计算机一级上机考试题库

2016年计算机一级上机考试题库第1题、 ****** 本套题共有5小题 ******(1)新建文档WDA01.DOC,插入文档WTA01.DOC的内容,将文中所有“星星”替换为“行星”,存储为文档WDA01.DOC。(2)新建文档WDA02.DOC,插入文档WDA01.DOC的内容&…

stc单片机485发送多出一字节_单片机干货!STC8H案例制作分享(内含高清实物动图)...

本期,Lucy制作了九个案例分享给大家,分别为:流水灯、按键LED、数码管、点阵、定时蜂鸣器、NTC温度计、超声波测距仪、光敏RGB灯、氛围灯(红外)Lucy无偿提供全部案例的原理图和部分案例的代码。有需要的朋友先关注并私信我。需要源码私信我&am…