JDK17 核心语法糖
🍬 一、记录类(Record)
作用:替代传统 POJO,自动生成不可变数据类的构造器、访问器、equals()
、hashCode()
、toString()
。
语法差异:
// JDK 17
public record User(String name, int age) {}
// 等效于 JDK 8 的 50+ 行代码(字段、构造器、getter、equals 等)
特性:
- 隐含
final
修饰,字段不可变 - 访问方法为
name()
而非getName()
- 支持构造器参数校验和自定义方法
🔐 二、密封类(Sealed Classes)
作用:精确控制类的继承关系,避免滥用扩展。
语法差异:
// JDK 17
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {} // 子类必须为 final/sealed/non-sealed
// JDK 8:类可被任意继承,无限制
特性:
permits
指定允许继承的子类- 编译器强制检查穷尽性(如结合
switch
模式匹配)
🔍 三、模式匹配(Pattern Matching)
1. instanceof
模式匹配
作用:合并类型检查和转换,减少冗余代码。
// JDK 17
if (obj instanceof String s && s.length() > 5) {
System.out.println(s); // 直接使用 s
}
// JDK 8:需显式转换
if (obj instanceof String) {
String s = (String) obj;
// ...
}
2. switch
模式匹配
作用:支持类型匹配和返回值,替代复杂 if-else
。
// JDK 17
String result = switch (obj) {
case Integer i -> "整数: " + i;
case String s -> "字符串: " + s;
default -> "未知";
};
优势:支持守卫条件(where
)和 null
处理
📜 四、文本块(Text Blocks)
作用:简化多行字符串(如 JSON、SQL、HTML)。
语法差异:
// JDK 17
String sql = """
SELECT * FROM users
WHERE status = 'ACTIVE'
ORDER BY name""";
// JDK 8:需手动拼接和转义
String sql = "SELECT * FROM users\n"
+ "WHERE status = 'ACTIVE'\n"
+ "ORDER BY name";
特性:自动处理缩进,支持行连接符 \
⚡ 五、增强的 switch
表达式
作用:将 switch
从语句升级为表达式,支持直接返回值和箭头语法。
语法差异:
// JDK 17
String day = switch (dayCode) {
case 1 -> "周一";
case 2 -> "周二";
case 3, 4, 5 -> "工作日"; // 多值匹配
default -> "周末";
};
// JDK 8:冗长且需 break
switch (dayCode) {
case 1: return "周一";
case 2: return "周二";
// ...
}
扩展:支持 yield
返回值(多行逻辑)
🧩 六、接口的私有方法
作用:在接口中封装重复逻辑,供默认方法调用。
// JDK 9+ 支持,JDK 17 完善
public interface Logger {
default void logInfo(String msg) { log(msg, "INFO"); }
private void log(String msg, String level) {
System.out.println("[" + level + "] " + msg);
}
}
差异:JDK 8 的接口仅支持默认方法和静态方法
🔄 七、Stream API 增强
新增方法:
Stream.toList()
:替代collect(Collectors.toList())
Stream.mapMulti()
:替代flatMap
的复杂场景
// JDK 16+
List<String> names = people.stream()
.map(Person::name)
.toList(); // 一行替代旧版收集器
⚖️ 八、与 JDK 8 的核心差异总结
特性 | JDK 8 | JDK 17 |
---|---|---|
数据类 | 冗长 POJO(手动模板代码) | record (一行定义) |
继承控制 | 完全开放或 final | 密封类(sealed + permits ) |
类型匹配 | instanceof + 显式强转 | 模式匹配(直接绑定变量) |
多行字符串 | 拼接 + 转义 | 文本块(""" ) |
switch | 语句(无返回值,需 break ) | 表达式(返回值、箭头语法、模式匹配) |
垃圾回收 | Parallel GC / G1 GC | ZGC(亚毫秒停顿)、Shenandoah |
空指针异常 | 无上下文信息 | 详细提示 NullPointerException 原因 |
💎 总结
JDK 17 通过记录类、密封类、模式匹配等语法糖,显著提升了代码简洁性和安全性,尤其在以下场景:
- 数据建模:
record
替代传统 POJO,减少 90% 样板代码。 - 领域驱动:密封类精准控制继承关系,避免滥用扩展。
- 分支处理:
switch
表达式 + 模式匹配替代复杂if-else
,支持穷尽性检查。 - 模板文本:文本块优化 SQL/JSON/HTML 的编写体验。
迁移建议:
- 新项目直接采用 JDK 17(LTS 支持至 2029 年)。
- 旧项目逐步替换弃用 API(如
Date
改用java.time
),并测试模块化兼容性。
这些特性不仅减少代码量 30%~50%,还通过编译器强制检查(如密封类继承、模式匹配穷尽性)提升健壮性,标志着 Java 向现代化语言的转型。