java记录目录树_Java记录

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记录与Java 8、9一起使用。

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

java记录目录树

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

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

相关文章

java集合——遗留的集合

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——遗留的集合 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-java-volume/blo…

oracle 扩展分区,Oracle 在线扩展分区

在对Oracle分区表操作是&#xff0c;当一个分区已经有了最大的分区&#xff0c;如何再次扩展分区呢&#xff1f;简单的方式是先删除最大分区&#xff0c;然后添加需要的分区在对Oracle分区表操作是&#xff0c;当一个分区已经有了最大的分区&#xff0c;如何再次扩展分区呢&…

java之StringBuider与StringBuffer

一、StringBuider与StringBuffer StringBuider与StringBuffer类比String更加灵活&#xff0c;只要使用字符串的地方&#xff0c;都可以使用StringBuider与StringBuffer类。三者的共同之处都是 final 类&#xff0c;不允许被继承&#xff0c;这主要是从性能和安全性上考虑的&…

织机原理_项目织机

织机原理为什么为什么&#xff1f; Java 8流背后的驱动程序之一是并发编程。 在流管道中&#xff0c;指定要完成的工作&#xff0c;然后任务将自动分配到可用处理器上&#xff1a; var result myData.parallelStream().map(someBusyOperation).reduce(someAssociativeBinOp)…

java集合——java.util.Properties类

【0】README 0.1&#xff09;以下全文转自 &#xff1a;  http://trans.blog.51cto.com/503170/110227/ 【1】认识properties文件 1、 properties文件是一个文本文件2、 properties文件的语法有两种&#xff0c;一种是注释&#xff0c;一种属性配置。 注 释&#xff1a;前…

电力系统潮流计算matlab程序,大神们,求个电力系统潮流计算的matlab程序。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼ninput(Please input n\n); %n表示系统的节点数d0input(Please input d0\n); %d0表示系统的误差minput(Please inpit m\n); %m表示系统的pq节点的个数p0ones(n-1,1);q0ones(m,1);d1;dpvones(n-1,1);dqvones(m,1);dpzeros(n-1,1);dq…

java之正则表达式

一、匹配字符串String类的matchs方法用的是正则表达式匹配&#xff0c;matchs方法与equals类似。"javac".matchs("javac");"javac".equals("javac");结果都为true。match方法更强大&#xff0c;不仅能匹配固定字符串&#xff0c;还能匹…

gradle配置_Gradle配置

gradle配置在这篇文章中&#xff0c;我们将介绍有关Gradle配置的综合文章。 1.技术 Gradle是用于自动任务管理的开源构建工具。 它基于Apache Ant&#xff0c;Apache Maven的概念。 Gradle是使用Groovy语言开发的。 Gradle是使用基于Groovy的领域特定语言&#xff08;DSL&…

removeAll throws java.lang.UnsupportedOperationException

【1】出现的问题&#xff1a; 如果该列表list 不支持 removeAll 方法的话&#xff0c; 就会抛出UnsupportedOperationException 【2】解决方法&#xff1a; List<String> list new ArrayList(Arrays.asList(new String[]{"C","B","D"})…

C#的float、double与decimal

float 单精度浮点 32bit&#xff0c;double 双精度浮点64bit&#xff0c;decimal是高精度 128bit&#xff0c;浮点型。 float double 是 基本类型&#xff08;primitive type&#xff09;&#xff0c;decimal不是。 float 有效数字7位&#xff0c;范围 1.5 10E−45 to 3.4 …

matlab支持 编程语言,用于数学的10个优秀编程语言

原标题&#xff1a;用于数学的10个优秀编程语言译文&#xff1a;http://www.codeceo.com/article/10-programming-language-for-math.html英文&#xff1a;10 Great Programming Languages for Mathematics翻译&#xff1a;码农网 – 小峰作为一个对数学和编程语言充满激情的人…

java锁_Java锁

java锁锁是一种线程同步机制&#xff0c;例如同步块。 锁是使用同步块在内部实现的。 因此&#xff0c;我们可以在Java中使用锁代替同步关键字。 锁比同步块更灵活&#xff0c;更复杂。 从Java 5版本开始&#xff0c;JDK提供了几种锁实现&#xff0c;例如ReentrantReadWriteLo…

java线程——阻塞队列

【0】README 0.1&#xff09;本文均转自两篇网络文章&#xff0c; 转载地址在转载处做了标记&#xff0c; 旨在理清 “阻塞队列”的相关知识 &#xff1b; 【1】转自&#xff1a; http://www.cnblogs.com/dolphin0520/p/3932906.html 1.1&#xff09;在前面我们接触的队列都是…

C#接口

接口是指定一组函数成员而不实现成员的引用类型&#xff0c;其他类型-类和接口可以实现接口。1. 接口是一个引用类型&#xff0c;通过接口可以实现多重继承。2. C#中接口的成员不能有new、public、protected、internal、private等修饰符。3. 接口中只能声明"抽象"成员…

消费者驱动的契约测试_告诉我们您想要什么,我们将做到:消费者驱动的合同测试消息传递...

消费者驱动的契约测试相当早以前&#xff0c;我们从REST&#xff08;ful&#xff09; Web API的角度讨论了消费者驱动的合同测试 &#xff0c;尤其是将其投射到Java&#xff08; JAX-RS 2.0规范&#xff09;的角度。 可以公平地说&#xff0c;至少在公共API方面&#xff0c; RE…

linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件

摘要: 作者&#xff1a;Syn良子 出处&#xff1a;http://www.cnblogs.com/cssdongl 转载请注明出处快速mark一下这个命令细节&#xff0c;免得以后使用又忘记了大家都知道可以用echo来输出内容到文件&#xff0c;比如 echo “hello,word”>> temp.txt那么我现在想把hadoo…

java线程——信号量(Semaphore)+障栅(CyclicBarrier)

【0】README 0.1&#xff09;以下内容转自网络&#xff0c;旨在理清 “java线程——信号量&#xff08;Semaphore&#xff09;障栅&#xff08;CyclicBarrier&#xff09;”的相关知识 【1】信号量 1.1&#xff09;信号量定义&#xff1a;从概念上讲&#xff0c;一个信号量管…

C#的foreach

一、foreach语句 C#的foreach 语句不会解析为IL 代码中的foreach 语句。 C#编译器会把foreach 语句转换为 IEnumerable 接口的方法和属性。 下面是一个简单的foreach 语句&#xff0c;它迭代数组中的所有元素&#xff0c;并逐个显示它们&#xff1a; foreach (A a in aas)…

linux中echo命令不输出换行,shell脚本echo输出不换行功能增强实例

这是第8/101个脚本There are as many ways to solve this quirky echo problem as there are pages in this book. One of my favorites is very succinct:function echon{echo "$*" | awk { printf "%s" $0 }}You may prefer to avoid the overhead incur…

java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流

java联接pg库是否可以将联接的数据库表转换为Java Stream&#xff1f; 答案是肯定的。 由于我们已经多次提出这个问题&#xff0c;因此我们决定写另一篇动手实验文章&#xff0c;说明如何执行更高级的Stream Joins。 因此&#xff0c;这里是第六篇中的第五篇&#xff0c;后面还…