Java 14:记录
Java 14是在几周前问世的,它引入了Record类型,它是一个不变的数据载体类,旨在容纳一组固定的字段。 请注意,这是预览语言功能 ,这意味着必须使用--enable-preview
标志在Java编译器和运行时中显式启用它。
我将直接介绍一个Book
记录示例,该记录旨在保存书名,作者,出版日期和价格。 这是记录类的声明方式:
public record Book(String title, String author, LocalDate publishDate, double price) { }
您可以使用javap
查看编译器自动生成的代码:
public final class Book extends java.lang.Record { public Book(java.lang.String, java.lang.String, java.time.LocalDate, double ); public java.lang.String title(); public java.lang.String author(); public java.time.LocalDate publishDate(); public double price(); public java.lang.String toString(); public final int hashCode(); public final boolean equals(java.lang.Object); }
如上所示,编译器自动生成了构造函数,getter方法, hashCode
, equals
和toString
,从而使我们不必键入很多样板代码。
但是,记录不仅可以节省键入时间。 它们还使您的意图明确了,您希望将不可变数据项建模为一组相关字段。
用于现场验证的紧凑型构造器
现在,假设您要向记录添加验证和默认值。 例如,您可能要验证未以负价或未来发布日期创建Book
记录。 可以使用紧凑的构造函数来完成此操作,如下所示:
public record Book(String title, String author, LocalDate publishDate, double price) { //compact constructor (no parameter list), used for validation and setting defaults public Book { if (price < 0.0 ) { throw new IllegalArgumentException( "price must be positive" ); } if (publishDate != null && publishDate.isAfter(LocalDate.now())) { throw new IllegalArgumentException( "publishDate cannot be in the future" ); } this .author = author == null ? "Unknown" : author; } }
紧凑的构造函数没有参数列表。 它验证价格和发布日期,并为作者设置默认值。 在此构造函数中未分配的字段(即title
, publishDate
和price
)在此构造函数的末尾隐式初始化。
替代构造函数和其他方法
记录使您可以定义其他方法,构造函数和静态字段,如下面的代码所示。 但是,请记住,从语义上说,一条记录被设计为数据载体,因此,如果您觉得要添加额外的方法,则可能是需要一个类而不是一条记录。
public record Book(String title, String author, LocalDate publishDate, double price) { // static field private static final String UNKNOWN_AUTHOR = "UNKNOWN" ; // compact constructor, used for validation and setting defaults public Book { if (price < 0 ) { throw new IllegalArgumentException( "price must be positive" ); } if (publishDate != null && publishDate.isAfter(LocalDate.now())) { throw new IllegalArgumentException( "publishDate cannot be in the future" ); } this .author = author == null ? UNKNOWN_AUTHOR : author; ? UNKNOWN_AUTHOR : author; } // static factory constructor public static Book freeBook(String title, String author, LocalDate publishDate) { return new Book(title, author, publishDate, 0.0 ); } // alternative constructor, without an author public Book(String title, LocalDate publishDate, double price) { this (title, null , publishDate, price); } // additional method to get the year of publish public int publishYear() { return publishDate.getYear(); } // override toString to make it more user friendly @Override public String toString() { return String.format( "%s (%tY) by %s for £%.2f" , title, publishDate, author, price); } }
翻译自: https://www.javacodegeeks.com/2020/04/java-14-records.html
Java 14:记录相关推荐
- Spring Framework 5.2.5 发布,增加对 Java 14 的支持
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.oschina.net ...
- 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 14(Oracle JDK 14)
甲骨文两年来,每六个月如约发布新版本的Java,Oracle JDK 14为开发人员带来创新功能和新特性预览.Oracle JDK 14增加了一些新特性来提高开发人员工作效率,这些新特性包括:对swi ...
- Java 14 发布了,终于可以扔掉Lombok了?
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...
- java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- Java 14的新功能
2020年3月17日,Oracle发布了名为Java 14的Java新版本,其中包括许多新功能,工具,安全性,调试和更新的文档方面的改进. 但是,Oracle还向您提供Java的较旧版本,因为它具有向 ...
- 甲骨文Java 14来啦!
甲骨文两年来,每六个月如约发布新版本的Java,Oracle JDK 14为开发人员带来创新功能和新特性预览.Oracle JDK 14增加了一些新特性来提高开发人员工作效率,这些新特性包括:对swi ...
- Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
最新文章
- struts2 no extension(excludePattern)
- leetcode 371. Sum of Two Integers
- 共享卫士2.0版设置说明
- 约瑟夫(环)问题(Josephu)(单向环形链表)
- DllImport的用法
- python学习之数据类型(int,bool,str)
- 算法---计算平方根(牛顿迭代法)
- WebStrom的学习使用 H5开发
- 解决爬取网站过程中遇到的HTTP Error 302错误和中文乱码问题
- Intel酷睿前世今生(二)
- 中国黑客常用六种工具及防御方法(转)
- 传说中的世界500强面试题-反应能力
- 基于阿里云的基础架构设施保障(一)IAAS云计算
- 3D打印了这个杜邦线理线神器,从此桌面再也不乱了
- three.js物体移动以及相机的移动(位置以及旋转方位)
- 运筹学--线性目标规划
- 前端常用插件之calender日历控件
- java阶梯算法_上楼梯算法的java实现(转)
- 2021玛卜码面试题汇总:前端、运维、产品经理、Python、Java...
- 多智能体强化学习(MARL)训练环境总结
热门文章
- codeforces1486 F. Pairs of Paths(倍增+树上数数)
- 洛谷-P3203 弹飞绵羊 分块
- 使用Docker 实现微服务并搭建博客,一文全掌握
- 线上防雪崩利器——熔断器设计原理与实现
- 漫画算法:无序数组排序后的最大相邻差值
- 激动的时刻,终于成啦~
- 计划得一步一步实施,题库首先是第一步!
- Photoshop基本操作
- ssh(Spring+Spring mvc+hibernate)——EmpServiceImpl.java
- hibernate正向生成数据库表以及配置——Student.hbm.xml