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方法, hashCodeequalstoString ,从而使我们不必键入很多样板代码。

但是,记录不仅可以节省键入时间。 它们还使您的意图明确了,您希望将不可变数据项建模为一组相关字段。

用于现场验证的紧凑型构造器

现在,假设您要向记录添加验证和默认值。 例如,您可能要验证未以负价或未来发布日期创建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; }  } 

紧凑的构造函数没有参数列表。 它验证价格和发布日期,并为作者设置默认值。 在此构造函数中未分配的字段(即titlepublishDateprice )在此构造函数的末尾隐式初始化。

替代构造函数和其他方法

记录使您可以定义其他方法,构造函数和静态字段,如下面的代码所示。 但是,请记住,从语义上说,一条记录被设计为数据载体,因此,如果您觉得要添加额外的方法,则可能是需要一个类而不是一条记录。

 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:记录相关推荐

  1. Spring Framework 5.2.5 发布,增加对 Java 14 的支持

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.oschina.net ...

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

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

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

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

  4. 甲骨文正式发布Java 14(Oracle JDK 14)

    甲骨文两年来,每六个月如约发布新版本的Java,Oracle JDK 14为开发人员带来创新功能和新特性预览.Oracle JDK 14增加了一些新特性来提高开发人员工作效率,这些新特性包括:对swi ...

  5. Java 14 发布了,终于可以扔掉Lombok了?

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...

  6. java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  7. Java 14的新功能

    2020年3月17日,Oracle发布了名为Java 14的Java新版本,其中包括许多新功能,工具,安全性,调试和更新的文档方面的改进. 但是,Oracle还向您提供Java的较旧版本,因为它具有向 ...

  8. 甲骨文Java 14来啦!

    甲骨文两年来,每六个月如约发布新版本的Java,Oracle JDK 14为开发人员带来创新功能和新特性预览.Oracle JDK 14增加了一些新特性来提高开发人员工作效率,这些新特性包括:对swi ...

  9. Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

最新文章

  1. struts2 no extension(excludePattern)
  2. leetcode 371. Sum of Two Integers
  3. 共享卫士2.0版设置说明
  4. 约瑟夫(环)问题(Josephu)(单向环形链表)
  5. DllImport的用法
  6. python学习之数据类型(int,bool,str)
  7. 算法---计算平方根(牛顿迭代法)
  8. WebStrom的学习使用 H5开发
  9. 解决爬取网站过程中遇到的HTTP Error 302错误和中文乱码问题
  10. Intel酷睿前世今生(二)
  11. 中国黑客常用六种工具及防御方法(转)
  12. 传说中的世界500强面试题-反应能力
  13. 基于阿里云的基础架构设施保障(一)IAAS云计算
  14. 3D打印了这个杜邦线理线神器,从此桌面再也不乱了
  15. three.js物体移动以及相机的移动(位置以及旋转方位)
  16. 运筹学--线性目标规划
  17. 前端常用插件之calender日历控件
  18. java阶梯算法_上楼梯算法的java实现(转)
  19. 2021玛卜码面试题汇总:前端、运维、产品经理、Python、Java...
  20. 多智能体强化学习(MARL)训练环境总结

热门文章

  1. codeforces1486 F. Pairs of Paths(倍增+树上数数)
  2. 洛谷-P3203 弹飞绵羊 分块
  3. 使用Docker 实现微服务并搭建博客,一文全掌握
  4. 线上防雪崩利器——熔断器设计原理与实现
  5. 漫画算法:无序数组排序后的最大相邻差值
  6. 激动的时刻,终于成啦~
  7. 计划得一步一步实施,题库首先是第一步!
  8. Photoshop基本操作
  9. ssh(Spring+Spring mvc+hibernate)——EmpServiceImpl.java
  10. hibernate正向生成数据库表以及配置——Student.hbm.xml