Java 9 在 9 月 21 日 正式发布 ,同时 Oracle 宣布将 Java 新版本的 发布周期调整为每半年一次。目前,Java 新版本的开发也已正式进入轨道。就已公开的消息来看,下一个版本的 Java 预计会在 2018 年 3 月发布,版本号将会是 18.3 ,已经规划加入的特性包括 JEP 286 和 296。
根据 reddit 站点上的 讨论 ,首先更新的是 JEP 296,Valhalla 预计很快也会加入进来。OpenJDK 的 主页面 则显示,已确定要在 18.3 版本实现的是 JEP 286 和 296。
JEP 296 主要是将 JDK 仓库群(JDK Repository Forest)合并为一个仓库,旨在降低管理大量仓库群的成本。根据 InfoQ 之前的 报道 ,该仓库群的合并已经完成。这些软件仓库是在 OpenJDK 发展史上历次分裂生成的,在 OpenJDK 9 及以前的版本中将会继续存在。在这次合并操作之前,OpenJDK 曾分裂为多个不同的 Mercurial 软件仓库群,这导致了许多问题,例如不能以原子方式对多个软件仓库应用漏洞修复(Bug Fixes)。在 OpenJDK 合并完成后,只会有一个软件仓库,并复制在三个开发线上。为了简化仓库的管理,JDK 中还创建了用于在合并和未合并版本间 移动更改的工具 。
JEP 286 提议在 Java 中引入局部变量的类型推断,该 JEP 在 2016 年提出,InfoQ 曾经报道过该 JEP 的 概况 和相关的开发者 调查结果 。该 JEP 旨在减少编写 Java 代码相关的仪式性的内容,提升开发人员的体验,同时还要保证 Java 语言的静态性。它会减少开发人员在声明局部变量时,没有必要的变量类型声明。如果该 JEP 实现的话,在声明局部变量的时候,就可以采用类似如下的方式:
var list = new ArrayList(); // infers ArrayList
var stream = list.stream(); // infers Stream
这种语句只能用于带有初始化器(initializer)的局部变量、增强的 for-loop 中的索引以及传统 for-loop 中声明的局部变量。它不能用于方法声明、构造函数声明、方法返回值、字段、catch 语句以及其他类型的变量声明中。
关于局部变量的类型推断,不管是 JVM 体系中的语言还是其他语言都提供了一定形式的支持,比如 C++(auto)、C#(var)、Scala(var/val)以及 Go(通过:=进行声明)。至于该使用 var 作为关键字,还是使用 let 或类似于 C/C++中的 auto 作为关键字,之前曾经有过一个面向开发者的调查。大约 84%的回答表明定义可变内容的变量用关键字 var 是恰当的,只有百分之几的回答者建议使用 auto 更合适。根据 Java 语言架构师 Brian Goetz 介绍,该功能应该使用关键词 var。
关于该特性的用法,在 reddit 上有一些讨论。有人表示,即便在支持“auto”语法的语言中,该特性使用的也比较少,因为有些人希望一眼就能看出变量的类型是什么。也有人认为,var 有它的适用空间,在小的代码块中,直接用它实例化对象是可以的。如果是作为方法返回值的话,还是希望明确声明类型,Java 的类型推断并不支持方法返回值,这一点倒不必担心。如果函数或代码块比较长的话,就不建议使用 var 了并要考虑适时进行代码的重写。时间和经验将会让我们更加明确应该在何时使用新功能,就像 Optional 刚出现时,也是耗费了一些时间才明确其推荐适用场景。
Valhalla 项目 中包含了一些有趣的 JEP,包括 值类型 (Value Type)、 针对原始类型实现泛型功能 、 增强的 volatile 等,外界很期待这些内容最终也能添加到新版本中。
欢迎加入学习交流群569772982,大家一起学习交流。