Java 12 发布了,没有引起很大的讨论。对于 Java 这样一门成熟的语言来说,每一次更新似乎都无法满足庞大的 Java 开发群体与生态圈。再加上 Oracle 对 Java 耐人寻味的态度,Java 的未来会如何?
Java 的变化速度从未如此之快——如今,该语言的新版本每六个月就会发布一次。
而之所以能够实现如此重大的转变,自然离不开一系列专注于提高其性能与添加新功能的协作性项目的贡献。这些项目的目标可谓雄心勃勃。正如 JetBrains 开发者布道师 Trisha Gee 在 QCon 伦敦 2019 大会上所言,“Java 即将迎来很多超酷的东西。”
而发展道路中的以下三大主要项目,将有助于确定 Java 的未来方向。
一、Loom 项目
尝试改进 Java 语言的并发处理方式,或者说是在对计算机在不同指令集执行之间切换能力的探索。
甲骨文公司 Loom 项目技术负责人 Ron Pressler 在 QCon 伦敦 2019 大会上向希望编写软件以处理并发任务的 Java 开发者们提出了两种都不够完美的选项:要么编写无法通过扩展处理大量并发任务的“简单同步阻塞代码”,要么编写可扩展但编写难度极高且调试过程复杂的异步代码。
为了寻求解决这个问题的方法,Loom 项目引入了一种将任务拆分为线程的新方法——所谓线程,即是指计算机在运行指令时的最小可能执行单元。在这方面,Loom 引入了被称为 fibers 的新型轻量级用户线程。
他在大会上指出,“利用 fibers,如果我们确保其轻量化程度高于内核提供的线程,那么问题就得到了解决。大家将能够尽可能多地使用这些用户模式下的轻量级线程,且基本不会出现任何阻塞问题。”
利用这些新的 fibers,用户将能够扩展 Java 虚拟机(JVM)以支持定界延续(delimited continuations)机制,从而使得指令集的执行实现暂停以及恢复。对这些延续进行暂停与恢复的任务将由 Java 中的 ForkJoinPool 调度程序以异步模式处理。
根据说明文档所言,fibers 将使用与 Java 现有 Thread 类非常相似的 API,这意味着 Java 开发人员的学习曲线应该不会太过陡峭。
二、Amber 项目
Amber 项目的目标,在于支持“更小、面向生产力的 Java 语言功能”的开发,从而加快将新功能添加至 Java 语言中的速度。
这套方案非常适合自 Java 9 以来,以更快速度持续发布的各 Java 新版本。
目前,以下 JDK 增强提案(简称 JEP)正在进行当中,并隶属于 Amber 项目之内。
生字符串:
https://openjdk.java.net/jeps/326
生字符串使得开发人员能够更轻松地对文本进行适当格式化,且无需引入由转义字符带来的复杂性。
举例来说,开发人员不必使用
转义字符来表示换行符,因此在以下字符串中:
Hello
World
可以直接编写为:
`Hello
World`
而非原本的:
"Hello
World
"
该提案的说明文档中提到,这一变更将使得各类文本客串的输入变得更加简单,包括文件路径以及 SQL 语句等等。
如大家所见,生字符串应被包含在反引号之内。
用于 JDK API 的 Java 编译器 Intrinsic:
https://openjdk.java.net/jeps/348
此项提案将允许开发人员对需要定期调用的重要代码段进行性能优化。
具体来说,它允许开发人员将特定于 JDK 的方法指定为编译时内部化候选项,从而指示编译器对其性能进行优化。
考虑到在 Java 当中的重要意义,此提案的说明文档将 String::format 与 Objects::hash 作为编译时内部化方法示例。这些方法可以使用 @IntrinsicCandidate 进行注释,以指示编译器将其视为编译时内部化候选项。如此一来,JDK 的 javac 编译器即可通过修改创建出内部化进程的处理机制。
Pattern Matching:
https://openjdk.java.net/jeps/305
Pattern Matching 能够简化利用 Java 中 instanceof 运算符检查对象是否属于特定类的过程,而后提取该对象的组件以进行进一步处理。
如此一来,以下操作语法:
if (obj instanceof Integer) {
int intValue = ((Integer) obj).intValue();
// use intValue
}
将可被简化为:
if (x instanceof Integer i) {
// can use i here, of type Integer
}
Switch Expressions:
https://openjdk.java.net/jeps/325
Switch expressions 已经在 Java 12 当中以预览版形式推出,允许开发人员利用更简单的语法通过 switch 语句为输入内容指定不同的响应方式。
举例来说,现在我们不再需要始终在以下语法当中使用 switch 语句:
switch (port) {
case 20:
type = PortType.FTP;
break;
}
而可以采取以下更为简洁的表达方式:
Switch (port) {
case 20 -> PortType.FTP;
}
三、Valhalla 项目
Valhalla 项目专注于支持“高级”JVM 与语言功能的开发。
目前 Valhalla 项目的候选提案还比较有限,具体包括:
Value Types:
https://openjdk.java.net/jeps/169
此项提案旨在允许 JVM 处理一种新的类型,即 Value Types。
这些新的不可变类型将拥有与 int 等基元类似的内存效率,但同时又与普通类一样能够保存一整套基元集合。提案说明文档中指出,其目标在于“为 JVM 基础设施提供处理不可变与无引用对象的能力,从而实现使用非基元类型进行高效按值计算的目标。”
Generic Specialization:
https://openjdk.java.net/jeps/218
此项提案扩展了适用于泛型的具体类型,其中包括基元以及即将推出的 Value Types。
四、来自 Oracle 的警告
Java 8 是目前使用率最高的一个 Java 版本,发布于 2014 年,而 Oracle 对 Java 8 的官方支持时间持续到 2020 年 12 月,之后将不再为个人桌面用户提供 Oracle JDK 8 的修复更新;在 2019 年 1 月之后,不再提供免费的商业版本更新,届时想要继续获得 Oracle 的商业支持和维护,需付费订阅。
近日,Oracle 的销售代表发出的一封邮件引起了热议,该邮件称“Java 8 的非公开可用的关键补丁更新”将于 2019 年 4 月 16 日发布,拥有有效许可证的客户才可以享用。邮件继续称,如果没有安装这些更新,可能导致“你的服务器和桌面环境暴露且易受***。”
但在许多 Java 用户看来,这封邮件像是一种敲诈勒索或恐吓策略。
五、Oracle 撒手,OpenJDK 继续向前
虽然 Oracle 官方选择了不再支持,但 Java 社区却把担子接了下来。红帽 Java 平台团队的首席工程师 Andrew Haley 曾表示,红帽计划在 2023 年之前继续提供对 OpenJDK 8 的支持:
在我看来,这算比较正常的。几年前,OpenJDK 6 更新(jdk6u)项目被 Oracle 放弃,我接管了它,然后 OpenJDK 7 也发生了同样的事情。最后,Azul 的 Andrew Brygin 接管了 OpenJDK 6。由来自多个组织成员组成的 OpenJDK Vulnerability Group 就重要的安全问题进行协作。在广大的 OpenJDK 社区和我的团队(Red Hat)的帮助下,我们定期为关键 bug 和安全漏洞提供更新。我觉得这样的过程同样适用于 OpenJDK 8 和下一个长期支持版本,即 OpenJDK 11。
如果可以得到社区的支持,我很高兴能够领导 JDK 8 更新项目和 JDK 11 更新项目。
除了红帽以外,AWS 推出了 OpenJDK 长期支持版本 Amazon Corretto。阿里巴巴也开源了 OpenJDK 长期支持版本 Alibaba Dragonwell。
六、Java 老矣,尚能饭否?
Java 是最好的语言么?不是,因为在每个领域都有更合适的编程语言。
C 语言无疑是现代计算机软件编程语言的王者,几乎所有的操作系统都是 C 语言写成的。C++ 是面向对象的 C 语言,一直在不断的改进。
JavaScript 是能运行在浏览器中的语言,丰富的前端界面离不开 Javascript 的功劳。近年来的 Node.js 又在后端占有一席之地。Python 用于系统管理,并通过高性能预编译的库,提供 API 来进行科学计算,文本处理等,是 Linux 必选的解释性语言。
Ruby 强于 DSL(领域特定语言),程序员可以定义丰富的语义来充分表达自己的思想。Erlang 就是为分布式计算设计的,能保证在大规模并发访问的情况下,保持强壮和稳定性。Go 语言内置了并发能力,可以编译成本地代码。当前新的网络相关项目,很大比例是由 Go 语言编写的,如 Docker、Kubernetes 等。
编写网页用 PHP,函数式编程有 Lisp,编写 iOS 程序有 Swift/ObjectiveC。
一句话概括,能留在排行榜之上的语言,都是好的语言,在其所在的领域能做到最好。
那么,Java 语言到底有什么优势可以占据排行榜第一的位置呢?
其一,语法比较简单,学过计算机编程的开发者都能快速上手。
其二,在若干了领域都有很强的竞争力,比如服务端编程,高性能网络程序,企业软件事务处理,分布式计算,Android 移动终端应用开发等等。
最重要的一点是符合工程学的需求,我们知道现代软件都是协同开发,那么代码可维护性,编译时检查,较为高效的运行效率,跨平台能力,丰富的 IDE,测试,项目管理工具配合。都使得 Java 成为企业软件公司的首选,也得到很多互联网公司的青睐。
没有短板,容易从市场上找到 Java 软件工程师,软件公司选择 Java 作为主要开发语言,再在特定的领域使用其他语言协作编程,这样的组合选择,肯定是不会有大的问题。
所以综合而言,Java 语言全能方面是最好的。
随着 Java 每半年更新一次的脚步,Java 的新版本中也出现了越来越多与其他语言相似的特性,博采众长的 Java,还能继续保持生机,你觉得呢?
原文地址:https://blog.51cto.com/13754022/2375031