Java记录

https://openjdk.java.net/jeps/359概述了新的Java功能,该功能可能会/将在某些将来的Java版本中实现。 JEP建议使用一种新型的“班级”:记录。 JEP中的示例内容如下:

 record Range( int lo, int hi) { public Range { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format( "(%d,%d)" , lo, hi)); }  } 

本质上,一条记录将是一个类,该类只打算在构造函数中设置final字段。 到今天为止,JEP还允许类具有的任何其他成员,但从本质上说,记录就是记录,它是纯数据,核心可能没有功能。 记录的描述简短而切合实际,并且消除了很多我们需要用Java 13或更少的语言编码此类或将要实现的版本记录的样板。 上面使用常规Java的代码如下所示:

 public class Range { final int lo; final int hi; public Range( int lo, int hi) { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format( "(%d,%d)" , lo, hi)); this .lo = lo; this .hi = hi; }  } 

考虑到我的Java :: Geci代码生成项目,这对于代码生成器来说是一个巨大的挑战,它弥合了当今与新功能在所有生产平台上都可用的那一天之间的差距。

因此,我开始考虑如何开发此生成器,并且遇到了一些问题。 Java :: Geci框架只能将可编译项目转换为另一个可编译项目。 它不能像将不完整的源代码转换为完整版本的其他代码生成器那样工作,该源代码无法将不完整的源代码(未经代码生成器的修改就无法编译)。 这是因为Java :: Geci在测试阶段起作用。 为了进入测试阶段,必须先编译代码。 这是一个众所周知的折衷方案,是一项设计决策。 在大多数情况下,当Java :: Geci有用时,这很容易解决。 另一方面,我们得到的好处是生成器不需要配置管理,例如读取和解释属性或XML文件。 它们仅提供API,并且从测试中调用它们的代码通过它配置生成器。 最大的优点是,您甚至可以通过生成器调用的方法引用,lambda或对象实例的形式提供回调,以便这些生成器在其工作的某些方面可以具有完全开放的结构。

为什么在这种情况下如此重要? 记录生成相当简单,不需要任何复杂的配置,事实上,它根本不需要任何配置。 另一方面,可compilable -> compilable compilable -> compilable限制正在影响它。 如果您开始使用Java 8和Java :: Geci创建记录,那么您的手动代码将如下所示:

 @Geci ( "record" )  public class Range { final int lo; final int hi;  } 

这不会编译,因为在代码生成开始之前的第一次编译时,默认构造函数不会初始化字段。 因此,这些字段不能为final

 @Geci ( "record" )  public class Range { int lo; int hi;  } 

运行发电机,我们将得到

 package javax0.geci.tests.record;  import javax0.geci.annotations.Geci;  @Geci ( "record" )  public final class Range { final int lo; final int hi; //<editor-fold id="record"> public Range( final int lo, final int hi) { this .lo = lo; this .hi = hi; } public int getLo() { return lo; } public int getHi() { return hi; } @Override public int hashCode() { return java.util.Objects.hash(lo, hi); } @Override public boolean equals(Object o) { if ( this == o) return true ; if (o == null || getClass() != o.getClass()) return false ; Range that = (Range) o; return java.util.Objects.equals(that.lo, lo) && java.util.Objects.equals(that.hi, hi); } //</editor-fold>  } 

这个生成器实际上所做的是

  • 它生成构造函数
  • 将JEP的要求将类和字段转换为final
  • 生成字段的吸气剂
  • 为该类生成equals()hashCode()方法

如果该类的void方法具有与该类相同的名称(尽管不区分大小写),例如:

 public void Range( double hi, long lo) { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format( "(%d,%d)" , lo, hi)); } 

然后发电机将

  • 从生成的构造函数中调用该方法,
  • 修改方法的参数列表以匹配当前字段列表。
 public void Range( final int lo, final int hi) { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format( "(%d,%d)" , lo, hi)); } //<editor-fold id="record"> public Range( final int lo, final int hi) { Range(lo, hi); this .lo = lo; this .hi = hi; } 

请注意,这种生成方法试图表现出JEP中建议的最接近实际record的可能,并生成可立即转换为新语法的代码。 这就是验证器方法必须与类具有相同名称的原因。 当转换为真实记录时,所有要做的就是删除将方法转换为构造函数的void关键字,删除参数列表,因为它将隐含在JEP中定义,并删除编辑器折叠之间的所有生成代码。 (也在首次执行生成器时自动生成)。

手动输入的代码的修改是Java :: Geci的新功能,它是由Record生成器的需求触发的,旨在克服可compilable -&gt; compilable的缺点compilable -&gt; compilable compilable -&gt; compilable限制。 后续文章中将详细介绍Java 1.:Geci的下一个1.3.0版本中提供的生成器如何使用此功能。

带走

本文的重点是,即使在Java记录可用之前,也可以将其与Java 8、9一起使用。

翻译自: https://www.javacodegeeks.com/2019/10/java-record.html

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

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

相关文章

C什么k什么_K线图基础知识丨什么是K线散兵坑形态?K线散兵坑形态的操作与案例详解...

本文总共999字&#xff0c;预计阅读需要3分钟今天我们给大家带来的是K线散兵坑形态&#xff0c;那么K线散兵坑形态应该怎么来操作呢&#xff1f;今天我们就结合相应的实战案例来为大家讲解一下吧。K线散兵坑形态的简介散兵坑是指在股价缓慢上涨过程中.成交量也逐渐放大&#xf…

support v4官方下载_掌心长兴客户端下载-掌心长兴ap下载v4.1.4 安卓官方版

掌心长兴app是一款为广大用户开发的新闻资讯软件。在这里用户可以清晰的了解今日热点新闻&#xff0c;最新新闻直播电台应有尽有&#xff01;让你全方面了解周边新鲜事&#xff01;还有各种常用功能的代办查询服务。有需要的用户&#xff0c;欢迎现在下载体验哦掌心长兴客户端介…

java简单计算机程序_JAVA程序编的简单计算器程序??

1 文件名&#xff1a;Calculate_GUI。javaimport javax。swing。*;import t。Container;import t。event。*;public class Calculate_GUI extends JFrame{private JPanel p1;private JButton keyButton[]new JButton[16],signButton,clearButton,deleteButton;private JTextFie…

javafx 调用java_Java验证(javafx)

javafx 调用java验证是核心javafx框架所缺少的一件事。 为了弥补这一空白&#xff0c; controlsfx中已经存在一个第三方验证库 。 但是&#xff0c;我有一个问题&#xff1a;它不是在考虑FXML的情况下创建的。 这并不是说它不是一个很好的库&#xff0c;只是错过了这个细节&…

win10分辨率不能调整_Win10系统分辨率不能修改怎么办?屏幕分辨率的调节方法...

Win10系统电脑屏幕分辨率无法调节怎么办&#xff1f;电脑屏幕分辨率不能修改怎么办&#xff1f;近日有很多用户询问电脑显示器分辨率不能修改的问题&#xff0c;下面就给大家分享解决方法。解决方法&#xff1a;1、在win10系统桌面空白处单击鼠标右键&#xff0c;在弹出的菜单中…

java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断

登录和权限验证判断在后台管理系统中是最常用的功能&#xff0c;这部分代码是比较固定和独立的&#xff0c;为了减少对业务代码入侵性&#xff0c;一般我会考虑使用Filter来实现&#xff0c;下面我就来详细说一下我的实现思路和代码&#xff1a;前台页面&#xff1a;String pat…

笔记本电脑电源已接通未充电_dell xps15 电源已接通 未充电 维修方法

&#xff08;去年写的文章&#xff0c;在知乎也存一份&#xff09;网上类似的文章很多&#xff0c;这里总结一下&#xff0c;这个问题按照严重程度可以分为四个层次&#xff1a;电源计划问题&#xff0c;大部分百度出来说的都是这个&#xff0c;实际上这个问题 等于没有问题。改…

cors spring_Spring,REST,Ajax和CORS

cors spring假设您正在为客户端开发基于JavaScript的项目&#xff0c;并且他通过其余的Web服务向服务器发出ajax请求&#xff0c;那么您可能会遇到一些麻烦&#xff0c;尤其是如果双方都在单独的域中。 实际上&#xff0c;出于安全原因&#xff0c;从一个域A到另一域B的Ajax请…

mysql bc_正则表达式——MySQL搜索过滤

正则表达式介绍在数据库的数据过滤过程中只用WHERE子句和LIKE操作符都是对于已知值进行的不管是匹配一个还是多个值&#xff0c;测试大于还是小于已知值&#xff0c;或者检查某个范围的值&#xff0c;都是使用已知的值当然MySQL语句也提供了通配符百分号(%)和下划线(_)来匹配多…

everything安装版和便携版有什么区别_A2奶粉内幕:国行版和澳洲版有什么区别 贵的不一定好!...

点击上方蓝字 关注我们申明&#xff1a;此文章来自第三方平台&#xff0c;绝无倾向性诱导。二桐粑粑转载分享。A2是全球首款添加了“A2-β酪蛋白”的奶粉&#xff0c;由新西兰A2公司于2013年推出&#xff0c;这款奶粉在澳洲一上架&#xff0c;就被妈妈们一扫而空。之后A2公司针…

哈希杰森

我最近写了一个简单的库&#xff0c;可预测地对json进行哈希处理 。 该实用程序基于出色的Jackson Json解析库构建 问题 我需要从相当大的基于json的内容生成的哈希值&#xff0c;以便稍后确定内容是否发生了更改。 将json视为字符串不是格式化的选项&#xff0c;键改组可能会…

java 什么时候用递归_如果要用Java实现算法,一定慎用递归

现象 &#xff1a;递归是我们很经典的一种算法实现&#xff0c;可以很好的描述一个算法的原理&#xff01;对于算法的描述、表现和代码结构理解上&#xff0c;递归都是不错的选择&#xff01;但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现&#xff0c;而是转换…

excel分两个独立窗口_Excel2010 多个独立窗口,解决单窗口无法显示多个文件的问题...

当我们需要编辑多个excel的时候&#xff0c;就会发现一个问题&#xff0c;Excel不能一个窗口下显示多个文档&#xff0c;每次编辑都进行切换就太麻烦了&#xff0c;那如何能解决这个问题呢&#xff1f;接下来跟我一起看看吧&#xff01;首先在开始菜单输入regedit.exe命令&…

jsp代码会被翻译成java代码吗_JAVA jsp技术

JSP的本质是一个类文件&#xff0c;它存储于tomcat(如果你使用tomcat)目录下的work文件夹中&#xff0c;该类文件继承了HttpJspBase类&#xff0c;而HttpJspBase类继承了HttpServlet类&#xff0c;所以其实质是一个servlet的类文件JSP脚本&#xff1a;1) ----- 内部的java代码翻…

excel冻结窗口_excel怎么冻结窗口?excel冻结窗口怎么设置?

excel冻结行或列的技巧教程&#xff1a;一、冻结第一列1.选择 视图 > 冻结窗格 > 冻结第一列。2.列A和列B之间出现的细线表明第一列已冻结。二、冻结前两列1.选择第三列。2.选择 查看 > 冻结窗格 > 冻结窗格。三、冻结列和行1.选择要在滚动时保持可见的行下方和列右…

java 判断对象是否是xml格式_java对象与xml格式之间的转换

java对象是可以直接与xml相互转换的&#xff0c;但需要导入包&#xff1a;xstream-1.3.1.jar&#xff0c;在创建对象的时候&#xff0c;注意一定要new一个DomDriver&#xff1b;成功的测试代码如下&#xff1a;package com.xml; import com.thoughtworks.xstream.XStream; impo…

复合主键 复合外键_复合双重错误

复合主键 复合外键总览 在上一篇文章中&#xff0c;我概述了为什么BigDecimal大部分时间都不是答案。 尽管可以构造double会产生错误的情况&#xff0c;但在BigDecimal遇到错误的情况下构造情况也一样容易。 BigDecimal更容易正确&#xff0c;但更容易出错。 轶事证据表明&…

web service接口_win7 添加环回网卡+H3C 模拟器 防火墙开启Web功能

1、按下win R键&#xff0c;在其中输入&#xff1a;hdwwiz&#xff0c;然后点击“确定”或者按回车键&#xff0c;打开“添加硬件”对话框。2、看到如下界面时&#xff0c;选择“网络适配器”(如下图所示)&#xff0c; 在接着出现的界面中&#xff0c;左方“厂商”一栏里选择“…

java 实现nfa的化简_DFA与NFA的等价性,DFA化简

等价性对于每个NFA M存在一个DFA M’&#xff0c;使得L(M)L(M’)--------等价性证明&#xff0c;NFA的确定化假定NFA M&#xff0c;我们对M的状态转换图进行以下改造&#xff1a;解决初始状态唯一性&#xff1a;引进新的初态结点X和终态结点Y&#xff0c;X,Y∉S&#xff0c;从X…

eclipse查看git地址_gitamp;github的入门实战

一、Git概述&#xff08;1&#xff09;定义Git是目前世界上最先进的分布式版本控制系统。&#xff08;2&#xff09;能干什么&#xff1f;解决冲突、管理权限、代码备份、协同开发、版本还原、历史追查、版本记录、分支管理、代码审查&#xff08;3&#xff09;集中管理型版本管…