架构师·2018 年 4 月刊
InfoQ
InfoQ 编辑部
8324 人已学习
限活动获得
架构师·2018 年 4 月刊
15
15
1.0x
00:00/00:00
登录|注册

Java 10正式发布,它带来了这些新特性

北京时间 3 月 21 日,Oracle 官方宣布 Java 10 正式发布。这是 Java 大版本周期变化后的第一个正式发布版本(详见这里),非常值得关注。你可以即刻下载试用。
去年 9 月,Oracle 将 Java 大版本周期从原来的 2-3 年,调整成每半年发布一个大的版本。而版本号仍延续原来的序号,即 Java 8、Java 9、Java 10、Java 11.....
但和之前不一样的是,同时还有一个版本号来表示发布的时间和是否为 LTS(长期支持版本),比如 Java 10 对应 18.3。如下示例:
/jdk-10/bin$ ./java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)
需要注意的是 Java 9 和 Java 10 都不是 LTS 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而未来的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本(得到 Oracle 等商业公司的长期支持服务)。
这种发布模式已经得到了广泛应用,一个成功的例子就是 Ubuntu Linux 操作系统,在偶数年 4 月的发行版本为 LTS,会有很长时间的支持。如 2014 年 4 月份发布的 14.04 LTS,Canonical 公司和社区支持到 2019 年。类似的,Node.js,Linux kernel,Firefox 也采用类似的发布方式。
Java 未来的发布周期,将每半年发布一个大版本,每个季度发布一个中间特性版本。这样可以把一些关键特性尽早合并入 JDK 之中,快速得到开发者反馈,可以在一定程度上避免 Java 9 两次被迫推迟发布日期的尴尬。
下图为 2017 年 JavaOne 大会时,Oracle 公开的未来 Java 版本发布和支持周期图。

Java 10 新特性

这次发布的 Java 10,新带来的特性并不多。
根据官网公开资料,共有 12 个 JEP(JDK Enhancement Proposal 特性加强提议),带来以下加强功能。
JEP286,var 局部变量类型推断。
JEP296,将原来用 Mercurial 管理的众多 JDK 仓库代码,合并到一个仓库中,简化开发和管理过程。
JEP304,统一的垃圾回收接口。
JEP307,G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
JEP310,应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。
JEP312,ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。
JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。
JEP314,使用附加的 Unicode 语言标记扩展。
JEP317,能将堆内存占用分配给用户指定的备用内存设备。
JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。
JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。
JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为\FEATURE.\INTERIM.\UPDATE.\PATCH,分别是大版本,中间版本,升级包和补丁版本。

部分特性说明

1. var 类型推断

这个语言功能在其他一些语言 (C#、JavaScript) 和基于 JRE 的一些语言 (Scala 和 Kotlin) 中,早已被加入。
在 Java 语言很早就在考虑,早在 2016 年正式提交了 JEP286 提议。后来举行了一次公开的开发者调查,获得最多建议的是采用类似 Scala 的方案,“同时使用 val 和 var”,约占一半;第二多的是“只使用 var”,约占四分之一。后来 Oracle 公司经过慎重考虑,采用了只使用 var 关键字的方案。
有了这个功能,开发者在写这样的代码时:
ArrayList<String> myList = new ArrayList<String>()
可以省去前面的类型声明,而只需要
var list = new ArrayList<String>()
编译器会自动推断出 list 变量的类型。对于链式表达式来说,也会很方便:
var stream = blocks.stream();
...
int maxWeight = stream.filter(b -> b.getColor() == BLUE)
.mapToInt(Block::getWeight).max();
开发者无须声明并且 import 引入 Stream 类型,只用 stream 作为中间变量,用 var 关键字使得开发效率提升。
不过 var 的使用有众多限制,包括不能用于推断方法参数类型,只能用于局部变量,如方法块中,而不能用于类变量的声明,等等。
另外,我个人认为,对于开发者而言,变量类型明显的声明会提供更加全面的程序语言信息,对于理解并维护代码有很大的帮助。一旦 var 被广泛运用,开发者阅读三方代码而没有 IDE 的支持下,会对程序的流程执行理解造成一定的障碍。所以我建议尽量写清楚变量类型,程序的易读维护性有时更重要一些。

2. 统一的 GC 接口

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java 10的正式发布标志着Java版本发布周期的变化,以及对开发者工作效率和代码维护性的影响。本次发布包含了一些新特性,其中最引人注目的是var局部变量类型推断和统一的垃圾回收接口。var类型推断使得开发者无需声明变量类型,编译器会自动推断,提高了开发效率。另外,统一的GC接口使得各个GC实现共享依赖代码,包括目前默认的G1,以及经典的Serial、Parallel、CMS等GC实现。此外,文章还介绍了Java 10中的其他特性,如应用程序类数据(AppCDS)共享、JEP314的Unicode语言标记扩展以及查看当前JDK管理根证书等。值得一提的是,通过实验,作者展示了AppCDS对应用启动时间的提升,这对云端应用部署具有重要意义。此外,文章还展望了Java 11版本,预计会充分发挥模块化的能力,将当前JDK中的关于JavaEE和Corba的部分移除,变得更加紧凑。总的来说,Java 10的发布标志着Java版本发布周期的变化,以及对开发者工作效率和代码维护性的影响,同时也展望了Java 11版本的发展方向。

登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
大纲
固定大纲
Java 10 新特性
部分特性说明
1. var 类型推断
2. 统一的 GC 接口
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部