Java 是一种多功能且功能强大的编程语言,它使开发人员能够创建可以在任何平台上运行的强大、高性能应用程序。Java 是几乎所有类型的网络应用程序的基础,也是开发和交付移动应用程序、游戏、基于 Web 的内容和企业软件的全球标准。凭借其丰富的功能,Java [...]
Java 是一种功能强大、用途广泛的编程语言,可帮助开发人员创建可在任何平台上运行的强大、高性能应用程序。Java 是几乎所有类型的联网应用程序的基础,也是开发和交付移动应用程序、游戏、基于 Web 的内容和企业软件的全球标准。
Java 拥有丰富的库,可帮助开发人员创建创新高效的解决方案。Java 平台提供了开发具有动态行为的应用程序的环境。该平台还包括一组工具,可帮助开发人员轻松设计、测试、优化和部署其应用程序。
它最初于 1995 年发布,此后经历了多次更新。Java 编程语言是一种高级面向对象语言,以其可移植性和平台独立性而闻名。
经过20 多年的 发展,Java 编程语言已成为当今最流行的语言之一。事实上,根据2022 年 10 月的 TIOBE 指数,Java 被评为全球第三大最受欢迎的编程语言,仅次于 C 和 Python --- 这一趋势自 2018 年以来一直保持着。
Java 19 中的新功能:简介
Java 开发工具包 (JDK)的最新更新于 2022 年 9 月 20 日发布。这是一个非 LTS 版本,旨在添加几个新功能,包括结构化并发、记录模式、外部函数和内存 API 的预览,以及对开源 Linux/RISC-V 指令集架构 (ISA) 的支持。
您可能会问,非 LTS 是什么意思?长期支持 (LTS) 是针对特定软件版本的扩展支持阶段。长期支持包括支持期内的安全更新、错误修复和性能增强。虽然它通常不是软件的最新版本,但需要对其应用程序进行长期支持的用户可能需要考虑使用 LTS 版本。
对于 Oracle 来说,Java 的 LTS 版本是行业标准,直到其生命周期结束。截至 2022 年,当前的 LTS 版本是 Java 17,计划于 2026 年结束运行。
在这种情况下,非 LTS 版本是小更新,通常用于测试新功能并收集社区反馈。例如,在 Java 19 的情况下,除 Linux/RISC-V 功能外,上面提到的所有功能都处于预览或孵化阶段。
实验性、预览性和孵化器功能之间的区别
要了解 Java 版本的工作原理,我们必须熟悉 Oracle 使用的符号:实验性、预览和孵化器。这些都是用来指代尚未完全集成到 Java 中的新功能的标签。
Java 预览
预览功能早在 JEP12 中就已引入。引用OpenJDK的话:"预览功能是 Java 语言、Java 虚拟机或 Java SE API 的一项新功能,它已完全指定、完全实现,但尚未永久。它在 JDK 功能版本中可用,以根据实际使用情况激发开发人员的反馈。"
将预览版与后期 Beta 测试进行比较是公平的。该功能已经过全面测试,应该很稳定。进入预览阶段的功能通常是用户反馈的目标,Oracle 会根据情况进行修复或更改,或最终发布。
预览功能的"宽限期"非常短,因此您几乎看不到什么变化,而且其全面采用通常在首次发布后的一年内进行。
由于预览功能不是 Java SE 平台中的永久功能,因此在编译时和运行时默认情况下它们不可用。希望使用预览语言功能和 API 的开发人员必须在编译器和运行时中明确启用它们。
Java 实验
实验性功能是(大多数)虚拟机级功能的早期版本。虽然经过测试,但它们可能存在风险、不完整甚至不稳定。要访问实验性功能,通常,开发人员必须使用专用标志启用它们。
具体来说,如果预览功能完成度达到 95%,那么实验功能完成度约为 25%。推出这些功能是为了让早期采用者和爱好者能够试用新功能并提供反馈、报告错误或开始探索其潜力。
请记住,每个供应商都可以自由地根据自己的需要在其发行版中启用/禁用实验性功能。
Java孵化器
孵化功能是 API,以模块形式分发,名称以*"JDK.incubator"为前缀。*与实验性功能一样,孵化器 API 也会出现错误且不稳定。孵化器这个名称源于这样一个事实:这些 API 会在多个 Java 版本中逐渐成熟,直到它们准备好进入预览阶段。
Java 项目
我们今天要讨论的大多数功能都是Java 项目的成果。项目是一种协作努力,旨在产生特定的成果,这些成果可能是代码主体、文档或其他材料。
任何贡献者都可以提议创建新项目。如果得到至少一个小组负责人(其小组将赞助该项目)的支持,并且得到 OpenJDK 成员的懒惰共识的批准,则将创建该项目。
著名项目包括:
Loom 项目
Project Loom 是一个承诺提供轻量级线程的项目。这是通过让 Java 虚拟机 (JVM) 而不是操作系统 (OS) 管理调度来实现的。这样,JVM 可以控制所有线程的调度,理论上可以提供更好的性能。
瓦尔哈拉计划
Valhalla 项目旨在提高 Java 的性能。它通过引入值类型来实现这一点,值类型是一种新的数据类型,其编程方式与对象类似,但访问方式与基元类似。这意味着它们可以存储在单个数组中,整个数组只有一个标头字段,并且可以直接访问各个字段。
巴拿马项目
Project Panama 是一个让 Java 程序与非 Java 组件(如基于 C 的库)连接起来更加容易的项目。该项目有几个子项目,这些子项目在 Java 的最新版本中以孵化器状态发布。这些子项目包括外部内存访问 API、外部链接器 API、矢量 API 和外部函数接口 API。
琥珀计划
Project Amber 是一个负责为 Java 编程语言添加多项新功能的项目。他们的使命宣言是:"探索和孵化较小的、以生产力为导向的 Java 语言功能,这些功能已被接受为候选 JEP。"
这些功能包括局部变量的 var 关键字、文本块、记录和比较实例中的模式匹配。该项目仍在进行中,目前正在努力添加密封类、开关中的模式匹配以及记录和数组的模式匹配。
Java 19 新特性
结构化并发
在计算机科学中,并发性是指程序、算法、资源或设备的不同部分或单元独立执行操作的能力。并发性可以同时处理多个任务,从而提高程序或系统的性能。它还可以帮助更好地利用资源,例如处理器、内存和磁盘空间。
这种并发将使多个任务在不同线程中运行,并将它们作为单个工作单元进行处理。根据 OpenJDK 的目标如下:
- 提高多线程代码的可维护性、可靠性和可观察性。
- 推广一种可以消除因取消和关闭而产生的风险的并发编程风格。
这是 Project Loom 的一部分,这是一个轻量级并发模型,可让开发人员更轻松地编写并发程序。它增加了对虚拟线程的支持,虚拟线程是未绑定到特定 CPU 核心的线程。这使得单个线程可以同时使用多个核心,从而提高性能。
记录模式预览
这是一项预览功能,允许嵌套记录模式和类型模式,以实现强大、声明性和可组合的数据导航和处理形式。例如,它基于 2021 年 3 月在 JDK 16 中提供的模式匹配。计划可能要求使用数组模式和可变参数模式等功能扩展记录模式。根据 JDK,目标是扩展模式匹配以表达更复杂的数据查询,而无需更改类型模式的语法。
外部函数和内存 API 预览
外部函数和内存 API 是 Java 程序与 Java 运行时之外的代码和数据交互的一种方式。此 API 可高效调用外部函数和访问外部内存。它使用起来很安全,有助于避免 Java 本机接口 (JNI) 的危险和脆弱性。外部函数和内存 API 在 JDK 17 中孵化,并在 JDK 18 中重新孵化。此提案的目标包括易于使用、性能良好、通用和安全。
虚拟线程预览
虚拟线程是轻量级线程,有助于减少编写、维护和观察高吞吐量并发应用程序所需的工作量。虚拟线程的目标包括:
- 使以简单的线程请求方式编写的服务器应用程序能够更轻松地以接近最佳的硬件利用率进行扩展
- 使使用 java.lang Thread API 的现有代码能够以最少的更改轻松采用虚拟线程
- 使用现有 JDK 工具实现虚拟线程的故障排除、调试和分析
Switch 表达式和语句的模式匹配预览
switch 表达式和语句模式匹配的第三个预览版增加了一些改进,包括用 switch 块中的 when 子句替换受保护的模式。此外,当选择器表达式的值为 null 时,模式 switch 的运行时语义与旧版 switch 语义更加一致。
该计划的目标包括通过允许模式出现在 case 标签中来扩展 switch 表达式和语句的表现力和适用性。其他目标包括允许开发人员在需要时放宽 switch 的历史空值敌意、提高 switch 语句的安全性,以及确保现有的 switch 表达式和语句继续编译而不发生任何变化并以相同的语义执行。
希望最终能够在整个 Java 中支持模式匹配,并将其添加到使用表达式的地方。此功能也是 Project Amber 的一部分。
第四次孵化载体 API
向量 API 是开发人员用 Java 编写复杂向量算法的一种方式。该 API 之前已在 JDK 16、JDK 17 和 JDK 18 中孵化。针对 JDK 19 提出的 API 改进包括增强了从 MemorySegments 加载和存储向量的功能,如 Foreign Function 和 Memory API 预览中定义的那样。JDK 19 还将添加两个跨通道向量操作(压缩和扩展),以及一个互补的向量掩码压缩操作。
压缩向量操作将由掩码选择的源向量的通道按通道顺序映射到目标向量,而扩展操作则执行相反的操作。压缩操作在筛选查询结果时很有用。除了向量 API 之外,还将扩展按位整数通道操作,包括计数 1 位的数量、反转位的顺序以及压缩和扩展位等操作。
该 API 的目标包括清晰简洁、与平台无关、在 x64 和 AArch64 架构上具有可靠的运行时和编译性能,以及实现"优雅"降级,以应对矢量计算在运行时无法完全表达为矢量操作序列的情况。矢量 API 来自 Panama 项目。
Linux/RISC-V 端口
Linux/RISC-V 端口将增加对许多不同语言工具链已经使用的硬件指令集的支持。RISC-V 是一系列相关指令集架构 (ISA),端口仅支持 RISC-V 的 RV64GV 配置。这是一个包含矢量指令的通用 64 位 ISA。Java 开发人员可能会考虑在未来增加对其他 RISC-V 配置的支持。
准备升级
您想试用 Java 19 吗?好吧,如果您想升级,请记住以下提示:
- **了解您的需求:**在升级之前,了解您的业务需求非常重要。列出有助于您的业务更高效运行的必备特性和功能。如果我们的功能列表中没有一项是您认为必不可少的,您可能需要问问自己是否真的有必要。
- **做好研究:**了解了需要什么之后,就该做一些研究,看看 Java 19 是否能帮到你。阅读在线评论、与行业内的其他企业交流,并从可靠的来源获取建议。请记住,其中一些功能仍处于试验阶段,因此请密切关注可能存在的错误和问题。
- **组织有序:**升级软件可能是一个大项目,因此在开始任何工作之前组织有序非常重要。制定完成任务的时间表,并确保所有参与人员都清楚自己的角色和职责。
- **合理预算:**升级软件最重要的方面之一是正确预算。显然,由于发布时间较短,因此预算方面需要考虑的很少。但您的开发人员仍必须阅读和学习文档,以便充分利用升级。为孵化期做好准备。
- **从小处着手并进行测试:**在沙盒中进行全新安装并进行一些尝试。利用这个机会让您的团队熟悉新功能。请记住,Oracle 仅提供六个月的支持,因此我们应该会在 2023 年 3 月左右看到 Java 20
是时候升级到 Java 19 了吗?
Java 19 将被设定为一个短期版本,而 Java 20 即将问世。那么,你应该升级吗?照例,这取决于具体情况。首先要考虑的问题是,你对这样的短期版本有何看法。如果你不介意频繁升级,那么你不妨充分利用最新版本带来的好处。
如果您希望在较长时间内坚持使用单一版本的 Java,那么您可能需要等待下一个 LTS 版本。升级到 Java 19 有什么好处?首先,值得注意的是,Java 19 中的变化并不像以前的一些版本那么显著。这可能是意料之中的,因为它是一个短期版本。
短期发布通常针对的是那些喜欢尽快尝试新功能的爱好者,但这些新功能可能会引入新的错误,并且稳定性可能较差。这是可以预料到的;毕竟,正如我们所见,大多数新功能仍处于测试阶段。
对于依赖 Java 17 的公司来说,答案显然是"不"。虽然一些新功能非常令人兴奋,但没有理由修复没有损坏的东西。您可以在沙箱中安装 JDK 并试用这些功能;您甚至可以使用经过几轮测试的功能开始开发。但是,如果您的策略是保持领先地位,那么聘请熟悉最新版本的Java 开发人员可能是为未来过渡做准备的明智之举。