告别 Java 8!Java 17 这些特性让开发更高效
Java 17 是 Java 的第一个长期支持版本 (LTS) 自 Java 11 以来的版本。与非 LTS 版本不同,LTS 版本具有长期支持和维护期,因此它们更适合用于生产环境。Java 17 包括了许多语言级别的新特性、JVM 改进以及库的增强。以下是 Java 17 的关键更新亮点:
1. 增强语言表达能力,例如 Switch 模式匹配和 Sealed 类。
2. 更强的跨平台支持,例如对 macOS/AArch64 的支持。
3. 一些长期弃用的功能(如安全管理器)在本版本中被彻底移除。
4. 引入了一些实验性功能,为未来 Java 的发展铺路。
Java 17 新特性详解
文本块的增强
文本块(Text Blocks)自 Java 15 引入后,在 Java 17 中得到了进一步优化。文本块允许开发者以更直观的方式定义多行字符串,使代码更易于阅读和维护。
示例代码
public class TextBlockExample {
public static void main(String[] args) {
String json = """
{
"name": "John Doe",
"age": 30,
"isDeveloper": true
}
""";
System.out.println("JSON Content: ");
System.out.println(json);
}
}
优势
• 自动格式化:文本块支持自动去除多余的空白字符。
• 增强的可读性:适用于定义 JSON、SQL 查询等多行结构化文本。
Switch 表达式模式匹配
在 Java 17 中,Switch 表达式模式匹配得到了显著改进。通过模式匹配,Switch 不仅可以对值进行匹配,还可以对类型进行匹配。
示例代码
public class SwitchPatternMatching {
public static void main(String[] args) {
Object obj = "Hello, Java 17!";
String result = switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s;
default -> "Unknown Type";
};
System.out.println(result);
}
}
优势
• 类型检查内置:无需显式的类型转换。
• 减少样板代码:代码更加简洁易读。
增强的 Sealed 类
Sealed 类限制了子类的扩展,确保类层次结构的安全性和可控性。Java 17 为 Sealed 类提供了更多的灵活性,允许开发者精确地控制子类的数量和范围。
使用场景
1. 封闭的业务模型:限制类的扩展,确保业务模型的可预测性。
2. 控制 API 的可用性:为库和框架设计提供更强的类型安全。
3. 增强代码安全性:防止未经授权的扩展和使用。
示例代码
以下是一个交通工具的层次结构示例,使用 Sealed 类确保只有特定类型的交通工具可以继承 Vehicle
。
public sealed class Vehicle permits Car, Truck, Bicycle {
}
public final class Car extends Vehicle {
// Car 的实现
}
public non-sealed class Truck extends Vehicle {
// Truck 的实现,可以被进一步继承
}
public sealed class Bicycle extends Vehicle permits MountainBike {
// Bicycle 的实现
}
public final class MountainBike extends Bicycle {
// MountainBike 的实现
}
解释:
•
Vehicle
是一个 Sealed 类,它的子类限制为Car
、Truck
和Bicycle
。•
Car
被声明为final
,因此无法被进一步继承。•
Truck
被声明为non-sealed
,允许继续扩展。•
Bicycle
继续作为 Sealed 类,限制子类为MountainBike
。
优势
• 可预测性:确保只有指定的类可以扩展基类。
• 安全性:防止未授权的扩展。
JEP 功能
JEP 356: 强化的伪随机数生成器
Java 17 提供了更强大的伪随机数生成器,支持流式生成器链。这一新特性可以帮助开发者生成更高质量的随机数,并简化了随机数生成的过程。
示例代码
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
public class RandomGeneratorExample {
public static void main(String[] args) {
RandomGenerator generator = RandomGeneratorFactory.of("Xoshiro256PlusPlus").create();
generator.ints(5, 0, 100).forEach(System.out::println);
}
}
优势
• 高质量随机数:提供了更强大的随机数生成算法。
• 更易用的 API:简化了随机数的生成过程。
JEP 382: 新的 macOS/AArch64 支持
Java 17 针对 macOS 的 ARM64 架构引入了全新支持,显著提升了性能和兼容性。
特性亮点
• 性能提升:ARM 架构特定优化,尤其适用于新的 Apple Silicon 芯片(如 M1)。
• 跨平台兼容:支持在 macOS 上使用 ARM 架构的设备,提升跨平台支持的广度。
外部函数和内存 API(孵化) (JEP 412)
特性介绍
Java 17提供了外部函数和内存API(在孵化阶段),以实验性特性的形式为本地代码提供了更好的互操作性。这使得Java程序能够更加轻松地调用本地库(如 C/C++)以及访问本地内存。
示例代码
import jdk.incubator.foreign.*;
public class ForeignFunctionDemo {
public static void main(String[] args) {
// 访问C的printf函数
var lookup = CLinker.getInstance().downcallLookup();
var printf = lookup.lookup("printf", MethodType.methodType(int.class, MemoryAddress.class, varargs)).get();
// 创建一个包含"Hello, Java 17!\n"字符串的本地内存
var message = "Hello, Java 17!\n";
var messageBytes = message.getBytes(StandardCharsets.UTF_8);
var messageMemory = MemorySegment.allocateNative(messageBytes.length + 1); // +1 for the null terminator
messageMemory.asSlice(0, messageBytes.length).copyFrom(MemorySegment.ofArray(messageBytes));
// 调用printf函数
printf.invoke(messageMemory.address());
}
}
特性优势
• 提高互操作性:使Java程序能够更加轻松地调用本地库(如C/C++)以及访问本地内存,为Java应用提供了更强大的功能。
• 跨平台性:外部函数和内存 API 是平台无关的,这意味着可以在不同的操作系统上实现相同的功能。
其他性能用户
1. 垃圾回收器的改进:
• Java 17中的G1垃圾回收器相比Java 8有了进一步的优化,减少了GC暂停时间,提高了垃圾回收的效率和吞吐量。
• Java 17还引入了ZGC和Shenandoah GC等低延迟垃圾回收器,进一步提升了应用程序的响应速度。
2. JIT编译器的优化:
• Java 17中的JIT编译器进行了性能优化,提高了编译速度和生成的机器代码质量,从而提高了应用程序的执行效率。
3. 内存管理的优化:
• Java 17引入了C++风格的内存管理,优化了堆内存分配和垃圾回收,提高了应用程序的性能和响应速度。
4. 并发性能的提升:
• Java 17对并发数据结构进行了优化,提高了多线程环境下的性能表现。
• Java 17还引入了新的API和库,如外部函数和内存API,提升了Java与其他语言的互操作性。
代码迁移与兼容性
对于从旧版本迁移到 Java 17 的开发者,以下是一些关键步骤:
1. 审查弃用功能:确保项目中没有使用已移除的功能。例如,Java 17 中已经移除了
SecurityManager
和一些其他的已弃用 API,开发者需要检查并替换这些过时的功能。2. 升级依赖:检查第三方库是否支持 Java 17。如果使用的是较旧的库,可能需要升级或替换为支持新版本的库。
3. 测试用例覆盖:通过单元测试和集成测试确保代码兼容性。由于 Java 17 引入了新的语言特性,可能会导致某些行为变化,因此需要全面测试。
4. 性能调优:Java 17 在垃圾回收和 JIT 编译方面也进行了优化,可以通过监控和基准测试,确定性能改进或潜在的性能回归。
总结
虽然市面上很多工具仍然是基于JDK8构建和运行,但随着技术的发展以及对性能、安全性等方面的更高要求,也逐渐呈现出将JDK升级到17的趋势。这一趋势主要是由于JDK17带来了诸多新特性,比如在语言特性方面有一定的增强,在安全性上进行了优化,并且在性能提升方面也有显著的表现,这些都促使越来越多的开发者和企业考虑将现有基于JDK8的工具逐步升级到JDK17。
像Spring Framework 6.0+
、Springboot 3.0+
、ApacheTomcat 10.1+
都已经开始使用了 JDK17。
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。