Java 10将会使用var关键字进行变量声明,本月底正式发布

百家 作者:聊聊架构 2018-03-07 01:36:30
作者|Tali Soroker
编辑|王纯超

早在 2016 年,有一个 JDK 增强提议(JEP)在 Java 社区引起了轰动:JEP 286。2 年后的今天,局部变量类型推断可以说是 Java 10 中最值得关注的特性。这是 Java 语言开发者为简化 Java 应用程序的开发而采取的又一举措。接下来我将为大家介绍这一举措的意义和对 Java 程序员的影响。

分解局部变量类型推断

这个新特性将为 Java 增加一些语法糖——简化它并改善开发者体验。新的语法让 Java 代码更简洁,同时保持静态类型安全。

换句话说,你将能够声明变量而不必指定关联的类型。比如之前如下的变量声明:

List list = new ArrayList();
Stream stream = getStream();

简介后的语法如下:

var list = new ArrayList(); 
var stream = getStream();

如上所示,局部变量类型推断将引入“var”关键字,而不要求明确指定变量的类型。

大家都知道,Java 的语法有点冗长,这对于理解开发人员编写函数的意图可能会有好处。但是,对于那些认为用 Java 开发软件太乏味的人来说,这个特性意味着一个重大的改变。

虽然类型推断在 Java 中不是一个新概念,但对于局部变量来说却是全新的。

这一切都是在 Java 5 中引入泛型时开始的。然后,Java 7 作为 Coin 项目的一部分进一步开发出了菱形运算符(<>),该运算符允许使用没有绑定类型的 ArrayList<>初始化列表,而 Java 8 中出现了 Lambda 表达式。使用菱形操作符可以编写以下代码:

List list = new LinkedList<>();

现在,Oracle 团队要更进一步。

社区反应

在 JEP 286 成为事实上的 JEP 之前,Oracle 进行了一项调查,以更好地了解 Java 社区对该提议的反应。调查大部分集中在对提议的总体感受上,以及社区对实现这个特性有哪些想法。在 2453 名开发人员的回复中,大部分是赞成的:

调查问题:你对局部变量类型推断提议的总体感受是怎样的?

调查的第二部分侧重于可能的语法选择,基于其他语言(如 C#、Scala、Swift 和 C ++)中的类似用法提出了 5 个选项,或使用 let。

大多数用户投票选择 var 和 val:

调查问题:可能的语法选项

最后,团队决定选用第二受欢迎的选项,也就是使用 var。

Java 社区的大多数成员似乎都赞同这种新的选择,其中许多人要求 Oracle“与时俱进”。少数反对该特性的开发人员声称,对于那些新学 Java 的人来说可能会很困难,也有人指出现有的语法是“冗长和易读性的最佳组合”。

当然,在 JEP 286 主页上,可以看到添加新功能的理由:

Java 几乎是唯一不包含局部变量类型推断的静态类型语言;因此,这个功能不应该再有争议。

对编码有何影响?

在兴奋过后,我们通常想问自己的第一个问题是:这对我的代码有何影响?在特性总结中,处理“Java 中样板编码的度”是主要动机,因此我们可以期待将来能够省略掉类型声明。

更具体的,它局限于:

  • 有初始化值的局部变量

  • 增强 for 循环中的索引

  • 传统 for 循环中声明的局部变量

Oracle 的 Java 团队申明,以下不支持局部变量类型推断:

  • 方法参数

  • 构造函数参数

  • 方法返回类型

  • 字段

  • catch 代码块(或任何其他类型的变量声明)

由于 Java 承诺支持以前版本,我们可以认为它不会破坏向后兼容性。

其他改进:GC 改进和其他内务特性

JDK 10 中有 2 个 JEP 专注于改进当前的 GC。第一个 JEP,垃圾回收接口(JEP 304),将引入一个干净的垃圾回收接口,以提升不同垃圾回收器的源代码隔离。

在当前的 Java 版本中,GC 源文件零散地分散在 HotSpot 源代码中。这在实现新的垃圾回收器时会成为问题,因为开发人员必须知道在哪里查找这些源文件。此 JEP 的主要目标之一是,使 HotSpot 内部 GC 代码更加模块化,GC 接口更干净并使实现新回收器更加容易。

Java 10 的第二个 JEP 是针对 G1 的 Parallel Full GC(JEP 307),其重点在于通过 Parallel Full GC 来改善 G1 最坏情况的等待时间。G1 是 Java 9 中的默认 GC,此 JEP 的目标是使 G1 也支持并行收集。

Java 10 计划的特性还有:

  • ThreadLocal Handshake(JEP 312)。这将引入一种在线程上执行回调的新方法,让关闭单个线程成为可能,而不是关闭所有线程或一个都不关闭。

  • 备用内存设备堆分配(JEP 316)。使 HotSpot 虚拟机能够在用户指定的备用内存设备上分配对象堆内存。

  • 额外的 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 仓库合并到一个仓库中。

  • 去掉 javah 工具(JEP 313)。

上手体验

就像所有其他 JDK 版本一样,Oracle 已经创建了一个 Early Access Release,Java 用户可以下载下来试用新功能。事实上,这个 JEP 自 2016 年初开始就已经可用于体验目的,那你还等什么?

http://jdk.java.net/10/

即使你还没有开始考虑迁移到 JDK 9,感受新功能并有机会向平台设计人员提供反馈,这是学习新版本并在社区产生一定影响的好办法。


想跟《Java 编程思想》的作者当面交流?

QCon 北京 2018 将于 4 月 20~22 日举行,目前已经邀请到《Java 编程思想》的作者 Bruce Eckel,《卓有成效的程序员》和《函数式编程思维》等畅销书的作者 Neal Ford,Apache Kafka 主要作者、项目委员会主席(PMC chair)Jun Rao,百度贴吧之父、滴滴产品高级副总裁俞军,Oracle Java 平台事业群 VP Georges Saab,还有 VR 领域的大牛,南澳大利亚大学教授、2013 IEEE VR 技术成就奖得主 Mark Billinghurst,另外 Prometheus 监控系统创始人之一 Julius Volz 也会分享 Prometheus 架构设计与最佳实践。Kotlin 核心开发团队的专家也会到场。

感兴趣的可以点击阅读原文链接或者扫描图片上方二维码了解更多信息。8 折优惠很快就要结束了(立减 1360 元),想参会的不要错过优惠时段。有任何问题欢迎咨询购票经理 Hanna,电话:15110019061,微信:qcon-0410。

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接