突出显示Java 10中新的Java局部变量类型推断功能
早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 。 现在,两年后,局部变量类型推断可以说是Java 10中最值得注意的功能。这是Java语言开发人员为简化Java应用程序编写所采取的又一个步骤。
在下面的文章中,我们将解释所有这些含义以及它将如何影响您的代码。
分解局部变量类型推断
这项新功能将为Java添加一些语法功能–简化它并改善开发人员的体验。 新语法将减少与编写Java相关的冗长性,同时保持对静态类型安全性的承诺。
换句话说,您无需指定关联的类型就可以声明变量。 声明如:
List <String> list = new ArrayList <String>();
Stream <String> stream = getStream();
将被以下新的简化语法取代:
var list = new ArrayList <String>();
var stream = getStream();
如您所见,Local Variable Type Inference将引入' var '关键字的使用,而不是要求明确说明变量的类型。
众所周知,Java有点冗长,在理解函数编写时您或其他开发人员的想法时可能会很不错。 但是,对于那些认为用Java开发软件过于繁琐的人来说,此功能标志着巨大的变化。
尽管类型推断不是Java中的新概念,但它是局部变量的新概念。
它是在Java 7中(作为Project Coin的一部分)通过菱形运算符(<>)引入的,该运算符允许在不使用类型绑定ArrayList <>的情况下初始化列表,而在Java 8中使用Lambda Formals进行引入。 例如,使用菱形运算符可以编写以下代码:
List <String> list = new LinkedList <String>();
现在,Oracle团队正在将其进一步发展。
社区回应
实际上,在JEP 286成为JEP之前……Oracle进行了一项调查 ,以更好地了解Java社区对该建议的看法。 在大多数情况下,调查着眼于对该提案的总体感觉以及社区如何实施该提案。 在回答的2,453个开发人员中,结果大部分是积极的:
该调查的第二部分重点介绍了潜在的语法选择,建议根据其他语言(如C#,Scala,Swift,C ++)的相似用法或使用“ let ”来选择5个选项。
大多数用户投票赞成var / val选项:
最后,团队决定选择第二受欢迎的选择,仅var 。
Java社区的大多数成员似乎都赞成这种新选择,其中许多人都要求Oracle“与时俱进”。 反对该功能的少数开发人员声称,对于那些开始使用Java迈出第一步的人来说可能会很困难,或者指出现有语法是“冗长和易读性的正确组合”。
当然,在JEP 286摘要页面上,您可以找到添加新功能的以下理由:
“ Java几乎是唯一不包含局部变量类型推断的流行的静态类型语言。 在这一点上,这不再是一个有争议的功能”
这将如何影响您的代码?
一旦我们从系统中获得了对新功能的全部兴奋,通常我们要问自己的第一个问题是:这将如何影响我的代码? 在功能摘要中,“ Java所需的样板编码程度”是主要动机,因此我们可以期待将来省略清单类型声明。
更具体地说,治疗将限于:
- 带有初始化器的局部变量
- 增强的for循环中的索引
- 在传统的for循环中声明的本地人
Oracle的Java团队声明它将不适用于:
- 方法参数
- 构造函数参数
- 方法返回类型
- 领域
- 捕获形式(或任何其他类型的变量声明)
由于Java承诺支持Java的早期版本,因此我们可以假定它不会破坏向后兼容性。
加:GC改进和其他客房整理
JDK 10中有2个JEP专注于改进当前的垃圾回收(GC)元素。 第一个垃圾收集器接口(JEP 304)将引入一个干净的垃圾收集器接口,以帮助改善不同垃圾收集器的源代码隔离。
在当前的Java版本中,HotSpot源中散布着一些GC源文件。 在实现新的垃圾收集器时,这成为一个问题,因为开发人员必须知道在哪里寻找这些源文件。 该JEP的主要目标之一是为HotSpot内部GC代码引入更好的模块化,具有更简洁的GC接口,并使其更易于实现新的收集器。
计划用于Java 10的第二个JEP是用于G1的并行完全GC(JEP 307),它致力于通过使完全GC并行化来提高G1最坏情况的延迟。 G1在Java 9中成为默认的GC,此JEP的目标也是使G1并行化。
在Java 10计划的其他功能中,我们可以期望:
- 线程本地握手(JEP 312)–这将引入一种在线程上执行回调的新方法,因此停止单个线程(不仅是所有线程或不停止所有线程)既可行又便宜。
- 备用内存设备上的堆分配(JEP 316)–允许HotSpot VM在备用内存设备上分配Java对象堆,这将由用户指定
- 附加的Unicode语言标签扩展(JEP 314)–目标是增强java.util.Locale及其相关API,以实现语言标签语法的附加unicode扩展(BCP 47)
- 基于Java的实验性JIT编译器(JEP 317)– Oracle希望使其Java JIT编译器Graal能够在Linux / x64平台上用作实验性JIT编译器。
- 根证书(JEP 319)–这里的目标是在Oracle Java SE中开源根证书
- 根证书颁发机构(CA)计划,使OpenJDK构建对开发人员更具吸引力。 它还旨在减少OpenJDK和Oracle JDK构建之间的差异
- 将JDK森林整合到一个单一的存储库中(JEP 296)–该JEP的主要目标是做一些内部管理,并将JDK森林的众多存储库合并到一个单一的存储库中
- 删除Native-Header生成工具(javah)(JEP 313)–这很简单,很重要–从JDK删除了javah工具
请在家尝试一下
就像其他所有JDK版本一样,Oracle已经创建了一个早期访问版本,Java用户可以下载该版本以测试新功能。 实际上,该JEP自2016年初以来就可以进行试驾了,所以您还等什么呢?
即使您尚未开始考虑迁移到JDK 9,了解新功能并有机会向平台设计者提供反馈也是了解新版本并对其产生影响的好方法。社区。
最后的想法
最近,我们一直密切关注Java平台的开发。 自从去年9月发布Java 9以来,感觉整个平台已经完成了180次。他们向我们介绍了模块化Java,加上Mark Reinhold宣布JDK 10将在2018年3月发布,并且Java将转换为Java 9。 6个月的发布周期。
诸如Project Jigsaw之类的功能强大的项目阻止了Java的新版本的发布。 现在,我们将每6个月获得一个新版本,从2018年9月JDK 11开始,每3年就会提供长期支持版本。
基本上,不要太自在。 Oracle在未来几年中对Java平台制定了宏伟的计划。 现在,虽然,被抓到的最好的Java 9与我们的工程副总裁,和合Steingarten的, 就在这里 。
翻译自: https://www.javacodegeeks.com/2018/03/java-10-will-change-way-code.html