Java 17 新特性详细教程
Java 17 是 长期支持版本(LTS),于 2021 年 9 月 发布,是继 Java 11 之后的又一个重要的稳定版本。Java 17 提供了许多语言特性和 API 改进,同时也移除了一些过时的功能,显著提高了语言表达能力和运行时性能。
本文将详细介绍 Java 17 的新特性,配以丰富的示例代码,帮助你快速理解并掌握 Java 17 的使用。
目录
- 密封类(Sealed Classes)
- 增强的 Switch 模式匹配
- 记录类的新功能(Record Classes)
- 文本块(Text Blocks)增强
- 删除和弃用的特性
- Java 17 的 API 改进
- 新 Garbage Collectors(GC)改进
- 上下文终止处理器(JEP 411)
- 新功能的综合示例
1. 密封类(Sealed Classes)
1.1 什么是密封类?
密封类是一种新特性,允许开发者严格控制子类的继承。通过定义一个密封类,可以限制哪些类能够继承它。
1.2 使用场景
- 更精确地控制继承关系。
- 更好的代码安全性和可读性。
- 避免了意外的类扩展。
1.3 示例
定义密封类:
public sealed class Shape permits Circle, Rectangle {
// Shape 的子类只能是 Circle 和 Rectangle
}
子类实现:
public final class Circle extends Shape {
// Circle 是最终类
}
public non-sealed class Rectangle extends Shape {
// Rectangle 是非密封类,其他类可以继续继承它
}
1.4 关键字说明
sealed
:定义密封类。permits
:指定允许继承密封类的子类。non-sealed
:允许子类取消密封。final
:子类不能再被继承。
2. 增强的 Switch 模式匹配
2.1 什么是模式匹配?
模式匹配是一种更灵活的方式来处理数据类型。它允许 switch
语句基于对象的类型和属性执行不同的逻辑,极大地增强了 switch
的表达能力。
2.2 示例
基础模式匹配:
public static String test(Object obj) {
return switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s;
case null -> "Null value";
default -> "Unknown type";
};
}
嵌套模式匹配:
public static String testNested(Object obj) {
return switch (obj) {
case String s && s.length() > 5 -> "Long String: " + s;
case Integer i && i > 10 -> "Large Integer: " + i;
default -> "Other";
};
}
2.3 优势
- 减少代码冗余:替代了传统的多次
instanceof
和强制类型转换。 - 提高可读性:通过简洁的语法表达复杂逻辑。
- 类型安全:编译器会检查类型匹配。
3. 记录类的新功能(Record Classes)
3.1 什么是记录类?
记录类是 Java 14 引入的一种特殊类,用于表示不可变数据对象。Java 17 对记录类进行了进一步增强。
3.2 新增强功能
-
支持记录类嵌套:
public record Outer(String name, Inner inner) { public record Inner(String detail) {} }
-
记录类的模式匹配:
public static String testRecord(Object obj) { return switch (obj) { case Outer(String name, Outer.Inner(String detail)) -> "Outer name: " + name + ", detail: " + detail; default -> "Unknown record"; }; }
3.3 优势
- 自动生成构造函数、
equals
、hashCode
和toString
方法。 - 提供不可变对象支持,简化数据对象的定义。
4. 文本块(Text Blocks)增强
文本块(Text Blocks)在 Java 17 中变得更加强大,支持格式化控制。
4.1 基本示例
String html = """
<html>
<body>
<h1>Hello, Java 17!</h1>
</body>
</html>
""";
System.out.println(html);
4.2 支持换行控制
-
使用
\
结尾来抑制换行:String text = """ Hello, \ Java 17! """; System.out.println(text); // 输出: Hello, Java 17!
5. 删除和弃用的特性
5.1 移除的特性
-
Applets:
- 浏览器插件 Applets 被彻底移除。
-
Security Manager(安全管理器):
- 安全管理器被标记为废弃,未来版本可能移除。
5.2 Deprecated 的 API
- 部分老旧 API 被废弃,但仍保留在 Java 17 中,建议使用现代替代方案。
6. Java 17 的 API 改进
6.1 新增 API
-
Objects.checkIndex()
和Objects.checkFromToIndex()
:- 用于验证数组或列表索引的合法性。
int[] array = {1, 2, 3}; Objects.checkIndex(2, array.length); // 合法,不抛异常 Objects.checkIndex(5, array.length); // 非法,抛异常
-
String
的新方法stripIndent()
:移除多行字符串中的公共缩进。translateEscapes()
:将转义字符还原。
String text = "Hello\\nWorld"; System.out.println(text.translateEscapes()); // 输出: Hello // World
7. 新 Garbage Collectors(GC)改进
7.1 G1 GC 改进
- G1 GC 的吞吐量和延迟进一步优化,默认选项更智能。
7.2 ZGC 的改进
- 支持更大的堆内存(高达 16TB)。
- ZGC 的暂停时间仍然保持在 10 毫秒以内。
8. 上下文终止处理器(JEP 411)
Java 17 引入了上下文终止处理器,增强了线程的生命周期管理。
示例
Thread t = Thread.startVirtualThread(() -> {
System.out.println("Hello, virtual thread!");
});
优势:
- 提供了更轻量级的线程模型。
- 简化高并发应用的开发。
9. 新功能的综合示例
综合案例:模式匹配 + 密封类 + 记录类
public sealed class Shape permits Circle, Rectangle {
public static String describe(Shape shape) {
return switch (shape) {
case Circle c -> "Circle with radius: " + c.radius();
case Rectangle r -> "Rectangle with sides: " + r.length() + " and " + r.width();
};
}
public static void main(String[] args) {
Shape circle = new Circle(10);
Shape rectangle = new Rectangle(5, 7);
System.out.println(describe(circle));
System.out.println(describe(rectangle));
}
}
public record Circle(int radius) extends Shape {}
public record Rectangle(int length, int width) extends Shape {}
输出:
Circle with radius: 10
Rectangle with sides: 5 and 7
总结
Java 17 提供了更强大的语言特性(如密封类、增强的 Switch 模式匹配),以及现代化的 API 和性能优化。这些新特性不仅简化了代码编写,还提高了运行效率。作为长期支持版本(LTS),Java 17 非常适合生产环境的应用开发。