Java 17 新特性:密封类、模式匹配与 Switch 表达式
Java 17 作为长期支持(LTS)版本,引入了多项重要特性,显著提升了代码的安全性、简洁性和表达力。以下是三个核心特性的详细解析:
1. 密封类(Sealed Classes)
目的:限制类的继承关系,明确指定哪些类可以继承或实现目标类/接口。
关键字:
sealed:声明密封类permits:指定允许的子类final/non-sealed:子类修饰符(必须显式声明)
示例:
// 定义密封类 Shape,仅允许 Circle 和 Rectangle 继承
public sealed class Shape permits Circle, Rectangle { }
// 子类必须声明为 final、sealed 或 non-sealed
public final class Circle extends Shape {
private double radius;
}
public non-sealed class Rectangle extends Shape {
private double width, height;
}
优势:
- 增强封装性:避免未知子类破坏设计逻辑
- 简化模式匹配:与
switch结合时,编译器可验证完整性
2. 模式匹配(Pattern Matching)
2.1 instanceof 模式匹配
语法:直接提取匹配对象的变量,避免冗余转型。
Object obj = "Hello";
if (obj instanceof String s) { // 匹配成功时自动转为 String 类型
System.out.println(s.length()); // 直接使用变量 s
}
2.2 switch 模式匹配(预览特性)
语法:在 switch 中直接匹配类型并提取变量。
Object obj = 42;
String result = switch (obj) {
case Integer i -> "整数: " + i; // 匹配 Integer 类型
case String s -> "字符串: " + s;
default -> "未知类型";
};
优势:
- 代码简洁:减少类型检查和强制转换
- 安全性:编译器检查模式覆盖完整性
3. Switch 表达式(Switch Expressions)
语法:
- 使用
->替代:,无需break - 可直接返回值
- 支持多值匹配和代码块
示例:
// 传统 switch 语句
switch (day) {
case MONDAY:
case FRIDAY:
System.out.println("工作日");
break;
case SATURDAY:
System.out.println("休息日");
break;
}
// Switch 表达式(Java 17)
String type = switch (day) {
case MONDAY, FRIDAY -> "工作日"; // 多值匹配
case SATURDAY -> {
System.out.println("周末"); // 代码块
yield "休息日"; // 使用 yield 返回值
}
default -> "其他";
};
优势:
- 无穿透风险:每个分支独立执行
- 表达力强:可直接赋值或返回结果
- 模式集成:结合类型匹配更强大
特性关联与实战价值
- 密封类 + 模式匹配:
Shape shape = new Circle(5.0); double area = switch (shape) { case Circle c -> $c.getRadius()^2 * \pi$; // 计算圆面积 case Rectangle r -> $r.getWidth() * r.getHeight()$; // 无需 default:编译器知道所有子类已覆盖 }; - 工程价值:
- 减少 Bug:编译时检查类型和分支完整性
- 提升可读性:代码更贴近业务逻辑
- 促进函数式风格:表达式化编程替代命令式
注意:模式匹配在
switch中为预览特性(Java 17),需通过--enable-preview启用;Java 21 中正式标准化。
1119

被折叠的 条评论
为什么被折叠?



