Java 8 发布 Q&A

  • Matt Raible
  • 臧秀涛

2014 年 3 月 27 日

话题:JavaDevOps语言 & 开发架构

多年以来,Java 8 一直是最受期待的编程语言更新之一。这次发布的版本包含了日期 API、Streams API 和 Lambda。包括移除永久代(permgen)在内,还有一些不错的改进。为了解该版本的更多信息,我们采访了 Oracle Java 平台组的软件开发副总裁Georges Saab

InfoQ:对于我们中那些没有紧跟Lambda项目的人,你可以就实现中涉及的内容给我们提供一些概念吗?我想这是Java语言、虚拟机和类库第一次这么协调的演进。

之前版本中,很多较大的特性都只影响了语言、虚拟机和类库这三个领域中的某一个,或者是另一种情形,每个领域的改变都是经历了一系列主要版本才引入的。

借助 Java 8 中的 Lambda,我们协调地对语言、类库和 JVM 进行了修改,在开发过程中,每个领域都能够影响和增强其他领域的设计与实现。

例如,我们在 JVM 上实验了 Lambda 的不同备选方案,发现可以使用 InvokeDynamic。这个过程中我们发现可以通过 InvokeDynamic 加以改进。以自然的方式结合使用 Lambda 和集合类,这种期望引出了 Streams API 的设计,扩展方法也由此而来,而扩展方法又需要语言方面的支持。

这是一个历经多年的演进过程,期间也有大量来自社区的极佳的反馈。

InfoQ:你认为Lambda的加入会把GroovyScala开发者带回Java语言吗?

有趣的是你提到的这两种语言(还有很多其他语言)都运行在 JVM 上。实际上为支持 Java 之外的语言运行在 JVM 上,我们做了很多工作。而且我们认为,对语言实现者而言,哪些东西在 JVM 上表现很好,哪些表现不好,这方面的经验他们还有很多要学的。当然实验小众语言比实验大众语言要容易得多。我们真正关注的是以深思熟虑、负责任的方式解决能够改进数百万 Java 开发者工作的事情。

InfoQLambdaStreams API的结合可以帮助我们开发清晰简洁的代码,但是像在过滤器后面跟一个过滤器这样以函数式方式缩减一个集合的范围,人们已经表露了对潜在的性能问题的担忧。这种担忧合理吗?为缓解这种开销引入了什么优化吗?

Stream 支持中间操作(intermediate)和最终操作(terminal)。像过滤器这样的中间操作实际上本身不执行任何过滤,相反,它们会创建一个新的 Stream,而这个 Stream 会在被遍历到时提供被过滤 Stream 中匹配给定谓词的元素。因此,一方面,创建额外的过滤器可能会致使运行时执行额外的工作。

另一方面,惰性处理 Stream,像所有中间操作都在 Stream 上做处理,会带来很高的效率,比如多个操作可以合并到对数据的一遍处理中。结合底层强有力的 JVM 优化——Lambda 在设计时也是仔细考虑过支持 JVM 优化的,额外的过滤器的潜在影响会明显减少。

另一个需要考虑的是,通过 Stream 和 Lambda,可以更轻松地使用并行。此外,对于用户不是特别关心其相交顺序的 Stream,减轻其顺序约束对并行 Stream 上的操作可能有好处。

InfoQJava 8的另一个重要特性是Java类型上的注解支持开发可插入式的类型检查器。你能多介绍一下吗,比如你希望看到开发者使用该特性来处理哪类任务?

该特效支持在类型的名字上使用注解,可以使用这些类型的大部分地方都可以使用这种注解。作为这一变化的一个结果,开发者可以编写注解,使用可插入式的类型检查器在编译时探测错误条件。社区正在为空指针错误、锁和国际化问题开发这样的检查器和注解模式。

Prof. Michael Ernst 教授的 Checker 框架(checker-framework.org)是这方面信息和实现的一个很好的参考,该框架提供了十多个这样的工具,其中一个是用于检查空指针的检查器。Michael 也担任过 JSR 308 的联席领导者,该语言特性就是在 JSR 308 中指定的。

如果能够看到至少有一个这样的注解机制在将来应用到 JDK 代码库中,我会很开心。而且当然,如果更广大的 Java 开发者社区开始在他们自己的代码库中使用该技术,并为解决其软件质量问题开发新的检查器,也会让人非常欣慰。

特别是在有关嵌入式和对安全要求很高的系统中,这种新方法允许在类型上加上重要属性和约束,而且这些属性和约束的使用可以用作编译过程的一部分,还可以同时进行静态分析。这为其他领域相关编程语言的用户在将来迁移到 Java 平台提供了一条途径。

InfoQ:你认为在Java 8中对动态语言的最大增强体现在哪里?

那一定要说 HotSpot VM 中的性能改进了,特别是围绕 invokedynamic 所做的工作。JDK 8 一个重要的新特性是 Nashorn JavaScript 引擎,这是一种流行动态语言的一个轻量级、高性能的实现。改进 Nashorn 的性能,帮我们在虚拟机中优化动态语言实现找到了新的机会。

此外,Nashorn 现在提供了一种非常方便的在 JavaScript 中使用 Java 的方式,支持以 JavaScript 编写完整的 JavaFX 应用,并运行在 JVM 上。运行在 JVM 上的动态语言和 Java 之间那种透明的互操作性为编写这样的应用提供了一种强有力的方式。

InfoQ:对Java和安全的担忧几乎一直是去年的头条新闻。Java 8Java浏览器或其他地方有具体的改进吗?

很多重要的安全改进和新特性已经作为 Oracle Java SE 7 更新的一部分交付了,包括部署规则集(Deployment Rule Sets)和异常站点列表(Exception Site Lists)。维护 Java 的安全是我们的第一要务。

此外,Java SE 8 包含了一些新的安全特性。最明显的可能是传输层安全(Transport Layer Security)实现的增强:现在平台默认支持 TLS 1.2。除了全面的安全 API,还有很多其他增强,包括从证书撤销检查改进到新的加密算法。

InfoQ:你是否知道使用 Java 567Java开发者比例?在加速Java 8的采用方面有什么计划吗?

在过去的 6 至 9 个月,我在世界各地的会议上发表过演讲,每次我都会问人们正在使用哪个版本。基于这种非正式且不够科学的调查,大部分 Java 开发者目前在使用 Java SE 7,仍在使用 Java 6 的明显属于少数(但不可忽略),还有少数人使用更老的版本。从开发者的角度看,Java SE 8 以新的语言特性和 API 的形式为快速采用带来了充足的理由。随着像 NetBeans、Eclipse 和 IntelliJ IDEA 等 IDE 努力在即将发布的版本中提供支持这些特性的良好工具,我预计开发者会快速拥抱 Java SE 8。

InfoQ:去年的JavaOne,最大的主题之一就围绕Java MESEEE的统一。Java 8在这个方向上走到什么程度了?

在 Java SE 8 的众多特性之中,有一个特性就是支持紧凑配置(Compact Profiles)。它们定义了 Java SE 平台规范的一些子集配置,支持部署不需要完整平台、运行在小型设备上的应用。结合 HotSpot 中的其他改进,比如减少类的元数据的内存占用,以及从整体上减少虚拟机内存占用,该特性支持 JDK 8 针对小型设备上的应用开发与部署按比例缩减。为进一步简化这一点,JDK 8 中包含了一个新工具jdeps,支持开发者找出其代码依赖的配置。

而另一个方向,Java ME 8 也正在增强,包含的语言特性、虚拟机和类库更为接近 Java SE 8 了。尽管你不能马上在 Java ME 8 代码中使用 Lambda,但是该平台现在支持 Java SE 5、6 和 7 中引入的语言构造,比如断言、泛型、枚举、在 switch 中使用字符串、try-with-resources 语句和菱形操作符。类似地,核心类库也做了更新,支持现代 Web 协议,像 IPv6,也支持高级安全特性,包括支持 TLS 1.2。与过去相比,Java SE 和 Java ME 两个平台走得更近了。

InfoQ:何时能看到Stripped Implementations加入Java中?

在 Java SE 8 发布之后,我们需要再看一下如何将该特性在 Java SE 9 之前的某个版本加入到平台中。这并非技术问题,而是事关如何确保规范文本和相关法律框架支持相应的用例,同时避免 Java 平台分裂。

非常感谢 Georges 回答我们的问题。Oracle 会通过 网络直播方式正式介绍 Java,届时 InfoQ 还会进行相关报道。

查看英文原文:Java 8 Launch Q&A

JavaDevOps语言 & 开发架构