Java 17 (JDK 17) 发布:全面了解新功能
Java 17,作为Java发展历程中的一个重要里程碑,于2021年9月发布。它是一个长期支持 (LTS) 版本,意味着Oracle将提供至少八年的支持和更新,使其成为企业级应用和长期项目开发的理想选择。 除了长期支持的承诺,Java 17还带来了众多令人兴奋的新功能和改进,旨在提高开发效率、增强语言特性、优化性能和提升安全性。 本文将深入探讨 Java 17 中的关键特性,帮助开发者全面了解这些新功能及其应用场景。
1. 增强的语言特性:
Java 17 在语言特性方面进行了多项增强,使其更具表达力、更加简洁,并有助于减少样板代码。
-
文本块 (Text Blocks) (JEP 378): 文本块极大地简化了多行字符串的处理。 在 Java 17 之前,要在代码中表示包含换行符和引号的多行字符串,开发者通常需要使用转义字符和字符串连接,这不仅繁琐,而且难以阅读。 文本块通过引入
"""
作为起始和结束分隔符,允许直接书写包含换行符、引号和其他特殊字符的多行字符串,无需转义。java
String html = """
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
""";
System.out.println(html);使用文本块可以显著提高代码的可读性和可维护性,尤其是在处理 JSON、XML、SQL 查询等包含大量文本内容的场景中。
-
密封类 (Sealed Classes) (JEP 409): 密封类允许开发者明确指定哪些类可以继承一个类或实现一个接口。 在 Java 17 之前,要限制类的继承,通常需要将构造函数设为私有,并提供静态工厂方法。 然而,这种方法并非总是适用,并且无法完全阻止恶意代码通过反射来绕过限制。 密封类通过
sealed
关键字声明,并使用permits
关键字指定允许继承或实现的类。“`java
sealed class Shape permits Circle, Rectangle, Square {
// …
}final class Circle extends Shape {
// …
}final class Rectangle extends Shape {
// …
}final class Square extends Shape {
// …
}
“`密封类提供了更强的控制力,有助于构建更安全、更可靠的系统。 它们特别适用于定义特定领域的类型层次结构,并防止意外的或未经授权的扩展。 使用密封类可以避免编写复杂的运行时类型检查,从而提高性能。
-
instanceof 模式匹配 (Pattern Matching for instanceof) (JEP 394): instanceof 模式匹配允许开发者在进行
instanceof
类型检查的同时,直接将对象强制转换为匹配的类型,并绑定到一个新的变量。 这消除了手动强制转换的必要性,从而减少了样板代码,并提高了代码的可读性。“`java
Object obj = “Hello, World!”;if (obj instanceof String s) {
System.out.println(s.length()); // 直接使用变量 s,无需强制转换
}
“`这种简洁的语法使得类型检查和类型转换更加高效,减少了代码中的重复,并降低了出错的可能性。
2. 新的 API 和库功能:
Java 17 引入了新的 API 和库功能,以简化开发任务,并提供更强大的工具来处理各种数据和场景。
-
新的 Stream API 方法: Java 17 对 Stream API 进行了一些增强,包括添加了新的方法,如
toList()
, 方便地将流收集到不可变列表。虽然之前的版本可以通过Collectors.toList()
达到类似的效果, 但toList()
更加简洁高效, 尤其是在需要创建不可变列表的时候。 -
平台日志记录 API (Platform Logging API) (JEP 305): 平台日志记录 API 提供了一个标准的、与具体日志框架无关的接口,用于在 Java 运行时环境中记录事件和消息。 这使得开发人员可以更容易地切换不同的日志框架,而无需修改应用程序代码。 平台日志记录 API 还允许 JVM 更好地管理日志记录资源,并提供更统一的日志记录体验。 虽然该 API 默认使用控制台输出, 但是可以通过自定义日志实现, 将日志输出到文件, 数据库或者其他存储介质。
-
改进的伪随机数生成器 (Enhanced Pseudo-Random Number Generators) (JEP 356): Java 17 引入了一组新的伪随机数生成器 (PRNG) 接口和实现,提供了更高的性能、更好的随机性,以及更多的控制选项。 新的 PRNG 包括 L32X64MixRandom、L32X64StarStarRandom、Xoroshiro128PlusPlus 等, 它们提供了不同的性能和随机性特征,以满足不同的应用需求。 这对于需要高质量随机数的应用,比如模拟、游戏和密码学等, 非常有用。
3. 性能优化:
Java 17 在性能方面进行了多项优化,旨在提高应用程序的吞吐量、减少延迟,并降低内存消耗。
-
ZGC 的增强 (Z Garbage Collector Enhancements): Z Garbage Collector (ZGC) 是一个低延迟的垃圾回收器,旨在实现亚毫秒级的最大暂停时间。 Java 17 继续增强 ZGC,包括并发线程堆栈处理, 改进内存分配, 并且支持更大的堆大小,使其更适合于对延迟敏感的应用。
-
Foreign Function & Memory API (Foreign Function & Memory API) (JEP 419): Foreign Function & Memory API (FFM API) 提供了一种安全高效的方式来访问本机代码和本机内存。 它允许 Java 程序与 C、C++ 等语言编写的本机库进行交互,并直接操作本机内存,而无需使用传统的 JNI (Java Native Interface)。 FFM API 提高了性能,并简化了本机代码的集成。 这个 API 仍在孵化阶段, 会在后续版本中持续改进。
4. 安全性增强:
Java 17 在安全性方面进行了一些改进,以增强应用程序的安全性,并防止恶意攻击。
-
强大的封装机制: Java 9 引入的模块系统,通过强封装,限制了内部 API 的访问, 提高了安全性。 Java 17 进一步加强了对内部 API 的访问限制, 减少了攻击面。
-
改进的加密算法: Java 17 更新了加密算法, 增加了对新的加密算法的支持, 并修复了已知的安全漏洞, 从而提高了应用程序的安全性。
5. 移除和弃用:
Java 17 移除和弃用了一些旧的 API 和功能,以简化 Java 平台,并鼓励开发者使用更现代的替代方案。
-
Applet API 的移除 (Removal of the Applet API) (JEP 398): Applet API 在 Web 浏览器中运行 Java 小程序,随着 Web 技术的发展,Applet 已经过时,并且存在安全风险。 Java 17 移除了 Applet API,以简化 Java 平台,并鼓励开发者使用更现代的 Web 技术,如 JavaScript 和 WebAssembly。
-
RMI Activation 的移除 (Removal of RMI Activation): RMI Activation 是 RMI (Remote Method Invocation) 的一个可选功能,允许远程对象在需要时被激活。 RMI Activation 已经很少使用,并且存在安全风险。 Java 17 移除了 RMI Activation,以简化 Java 平台。
6. 垃圾回收器变更:
除了对ZGC的增强,Java 17 还有其他的垃圾回收器相关的变更。
- 弃用 Concurrent Mark Sweep (CMS) 垃圾回收器: CMS 垃圾回收器已经被标记为弃用。 虽然它仍然可用, 但是建议迁移到G1或者ZGC垃圾回收器, 以获得更好的性能和更低的延迟。
7. 其他值得关注的特性:
除了上述关键特性之外,Java 17 还包含一些其他值得关注的特性:
-
上下文相关的反序列化过滤器 (Context-Specific Deserialization Filters) (JEP 415): 该特性允许根据反序列化的上下文来应用不同的过滤器, 从而提高反序列化的安全性。 这对于处理来自不可信来源的数据非常有用。
-
支持 Apple Silicon: Java 17 提供了对 Apple Silicon (M1 芯片) 的原生支持, 可以充分利用 Apple Silicon 的性能优势。
总结:
Java 17 作为 LTS 版本,提供了长期支持和众多新功能和改进,使其成为企业级应用和长期项目开发的理想选择。 它增强了语言特性,简化了开发任务,提高了性能,并增强了安全性。 通过全面了解 Java 17 中的关键特性,开发者可以充分利用这些新功能,提高开发效率,构建更强大、更可靠的应用程序。
为了充分利用 Java 17 的优势,建议开发者尽快升级到该版本,并开始探索和应用这些新功能。 随着 Java 的不断发展,我们可以期待在未来的版本中看到更多令人兴奋的特性和改进, 持续推动 Java 技术的发展。