章节导读
本章定位:JDK 12-17 这六个版本引入了自 JDK 8 Lambda 以来最重大的语言级变革——Records、Sealed Classes、Pattern Matching 将 Java 带入了"数据导向编程"时代。本章以"飞翔科技微服务现代化改造"为实战主线,逐一剖析这些颠覆性的新特性。
为什么需要学习 JDK 12-17?
2021 年 9 月,JDK 17 LTS 发布。这是继 JDK 11 之后第二个长期支持版本,也是目前企业级项目的主流基线。Spring Boot 3.x、Spring Framework 6.x 均要求 JDK 17+。如果教程停留在 JDK 11,学员将错过以下关键能力:
- 消灭样板代码:Records 一行定义数据类,不再需要 Lombok
@Data - 消灭显式 cast:instanceof 模式匹配一步完成类型判断和变量绑定
- 消灭 break 穿透:Switch 表达式箭头语法,永不 fall-through
- 消灭转义地狱:文本块三引号写 JSON/SQL/HTML,告别
\n和\" - 消灭继承混乱:密封类精确控制谁能继承,编译器帮你穷尽检查
白歌(飞翔科技架构师):"Records + sealed class + pattern matching 不是我预测的未来——这是已经到来的现在。Spring 6、Quarkus、Micronaut 全部拥抱了这些特性。如果你还在手写 getter/setter 和 equals/hashCode,你落后了整整一个 LTS 代际。"
本章知识图谱
七大核心特性一览
| 特性 | 版本路线 | 解决什么问题 | 对应章节 | 难度 |
|---|---|---|---|---|
| Switch 表达式 | JDK 12预览 → JDK 14正式 | 消灭 break 穿透,switch 可作为表达式返回值 | Switch表达式.md | ★★ |
| 文本块 Text Blocks | JDK 13预览 → JDK 15正式 | 消灭转义地狱,多行字符串原生支持 | 文本块.md | ★ |
| Records 记录类 | JDK 14预览 → JDK 16正式 | 消灭 DTO 样板代码,一行定义不可变数据类 | Records.md | ★★★ |
| instanceof 模式匹配 | JDK 14预览 → JDK 16正式 | 消灭显式 cast,一步完成类型判断 + 变量绑定 | instanceof模式匹配.md | ★★ |
| 密封类 Sealed Classes | JDK 15预览 → JDK 17正式 | 精确控制继承关系,编译器穷尽性检查 | 密封类.md | ★★★ |
| Helpful NPE + String | JDK 12/14/15 | 精准定位空指针 + String API 补完 | HelpfulNPE与String增强.md | ★ |
| Stream 增强 | JDK 12/16 | teeing 双收集器、toList 直接转不可变 List、mapMulti 替代 flatMap | Stream增强.md | ★★ |
学习路径建议
学习顺序不是按版本号,而是按认知曲线:先学消灭痛点的(文本块、Helpful NPE),再学改变编码方式的(Switch 表达式、instanceof、Records),最后学影响架构设计的(密封类)。Stream 增强因为依赖 Lambda/Stream 基础,放在 Records 之后。
实战场景:飞翔科技微服务现代化改造
大翔在 Q3 技术规划会上宣布:飞翔科技的订单系统和用户系统将从 JDK 11 升级到 JDK 17。这不是简单的版本号升级——这意味着:
- 订单 DTO 层用 Records 重写:
OrderDTO、OrderItemDTO从 30 行 Lombok 注解类变成 1 行 record - 状态机用密封类建模:
OrderStatus的PENDING → PAID → SHIPPED → DELIVERED用 sealed interface 约束,编译器保证穷尽 - JSON 配置用文本块:微服务的
application.yml常量告别\n和字符串拼接 - 类型判断用 instanceof 模式匹配:消息路由
if (msg instanceof OrderEvent e)一步搞定 - 性能优化用 toList/mapMulti:Stream 链不再创建中间 List
| 角色 | 身份 | 本章表现 |
|---|---|---|
| 大翔 | 技术总监 | 拍板升级决策,推动全公司 JDK 17 迁移 |
| 白歌 | 架构师 | 主导特性教学,设计 Records + 密封类的领域模型 |
| 小崔 | 后端开发 | 从"手写 getter/setter"到"一行 record"的蜕变 |
| 孔蓝 | 后端新人 | 用 Switch 表达式重构枚举处理,发现代码减半 |
| 黄俪 | 前端 | 用文本块写 JSON Mock 数据,感叹"早该有的东西" |
| 李眉 | 运维 | 部署 jpackage 打包的自包含应用,不再操心客户端的 JRE 版本 |
环境要求
| 项目 | 最低版本 | 推荐版本 |
|---|---|---|
| JDK | 17(LTS) | 17.0.9+ |
| IDE | IntelliJ IDEA 2021.3+ | 2024.x |
| 构建工具 | Maven 3.8+ / Gradle 7.3+ | Maven 3.9+ |
重要:本章部分特性在 JDK 17 中需要
--enable-preview参数(Switch 模式匹配为预览特性,不在本章展开;密封类已在 JDK 17 正式转正,无需预览参数)。
预备知识自检
开始本章学习前,请确认已掌握以下前置内容:
- [x] JDK 8 Lambda 表达式与函数式接口
- [x] JDK 8 Stream API(中间操作与终止操作)
- [x] JDK 8 Optional(基础用法)
- [x] JDK 11
var类型推断 - [x] JDK 11
List.of()/Set.of()不可变集合 - [x] Java 继承与多态基础
面试分值分布
2023 年起,大厂 Java 面试中 JDK 17 新特性的占比快速上升。Records 和密封类是必考点——面试官不再问"你用过 Lombok 吗",而是问"Records 和 Lombok @Data 有什么区别"。2024 年后这一趋势只会加速。
面试考点
面试官常问的三个问题:
问题一:"JDK 12-17 中最值得升级的三个特性是什么?为什么?"
答案:Records(消灭 DTO 样板代码,一行替代 Lombok @Data)、Sealed Classes(精确控制继承并配合 Switch 穷尽性)、instanceof 模式匹配(消除强制转换三部曲)。这三个特性的共同点是语言级支持——不依赖第三方库,编译期保障安全。Records 减少约 90% 的数据类代码量,Sealed Classes 消灭了"未知子类型"的运行时错误,instanceof 模式匹配使类型判断代码量减半。
问题二:"JDK 17 LTS 相比 JDK 11 LTS,企业升级的核心驱动力是什么?"
答案:第一,生态强制——Spring Boot 3.x / Spring Framework 6.x 要求 JDK 17+。第二,开发效率飞跃——文本块、Records、Switch 表达式等特性大幅减少样板代码。第三,运维提升——Helpful NPE 将空指针排查时间从分钟级降至秒级。第四,安全与性能——JDK 17 包含数千个 bug 修复和性能优化。综合来看,不升级意味着无法使用主流框架的最新版本,技术债务加速累积。
问题三:"Records、Lombok @Data、Java POJO 三者如何选择?"
答案:不可变数据载体优先用 Records(编译期生成、零依赖、语义清晰);需要可变性的简单 POJO 可用 Lombok @Data(但需接受注解处理器依赖和 IDE 插件限制);需要复杂继承关系或 JPA 实体(Hibernate 对 Record 支持有限)用传统 POJO。趋势是:新项目不可变 DTO 一律用 Records;Lombok 的使用场景逐步缩减到可变 POJO 和 Builder 模式等 Records 无法覆盖的领域。
大翔:"从 JDK 8 到 JDK 11,我们学会了删 pom.xml。从 JDK 11 到 JDK 17,我们要学会删代码——不是功能代码,是那些本不该存在的样板代码。Records、模式匹配、密封类,不是为了炫技,是为了让代码回归业务逻辑本身。"