JDK 17:record、sealed 与强封装,把 17 作为长期基线
JDK 17 是 8 / 11 之后的 LTS,也是很多团队从 8 / 11 升级的实际落点:record、sealed、instanceof 模式、switch 表达式与文本块在这里都已转正,JDK 内部 API 则从「默认拒绝」变成「一律拒绝」。它既是语言表达力的分水岭,也是运行时边界收紧的一代。
这一课,你必须能自己回答GOALS
合上资料后,逐条自述
- record 自动生成了哪些成员?紧凑构造器在什么时候执行,为什么不能写 this.x = x?
- sealed 的 permits 与 final / sealed / non-sealed 是什么关系?它如何让穷尽性成为可能?
- instanceof 模式变量为什么能进入 && 右侧,却不能进入 || 右侧?
- switch 表达式与 switch 语句的差别是什么?yield、穷尽性和 null 分别怎么处理?
- 文本块的附带空白如何计算?\s 与行尾 \ 各解决什么问题?
- JDK 17 的强封装改变了什么?--add-opens 与 --add-exports 分别适用于什么场景?
- G1、ZGC、Shenandoah 的取舍是什么?为什么「低停顿」不等于「更快」?
- 从 8 / 11 升到 17,哪些移除项、弃用项和 JVM 参数必须先处理?
三种模式,各解决一个问题MODES
学习路径TRACKS
面试突击 · 90 分钟
先结论后机制先刷高频题暴露盲区,再回到速查补齐 API 与版本边界。重点盯住 17 与 21 的差异:switch 类型模式、record pattern、Security Manager。
语言升级 · 1 天
从旧写法迁移按「record → sealed → instanceof 模式 → switch 表达式 → 文本块」顺序改造代码,最后用 sealed + 预览 switch 写一次 ADT,理解穷尽性到底由谁保证。
升级与运行时 · 1 天
强封装 + GC升级到 17 的真正成本在运行时假设:--illegal-access 失效、反射访问 JDK 内部包失败、Security Manager 只是弃用。把迁移清单与 GC 选择放在一起做。
换一个版本,继续同一门课SWITCH
所有完整课程共用「速查 → 深钻 → 面试」结构。切换版本后,再从顶栏版本菜单切一次,就会落在目标版本的同一模块。
全部学习单元9
速查模块 · 6 个主题
record:透明数据载体
record 用一行声明描述一组值:字段、访问器、equals/hashCode/toString 都由编译器生成。它的价值是「透明」——你能从声明直接读出对象状态,也因此不适合承载隐藏状态或复杂生命周期。
sealed:封闭类型集合
sealed 把「只允许这几个实现」从注释变成编译器可检查的约束。它不改变多态,也不做访问控制;真正的收益是让类型集合在编译期闭合,从而支撑穷尽性检查。
instanceof 模式:判断与绑定合并
instanceof 模式把类型判断和变量声明合并,省掉强转。它的关键是流作用域:变量只在编译器能证明匹配成功的路径上可见,而不是简单的块作用域。
switch 表达式:让分支返回值
switch 从语句变成表达式后,分支可以直接产出值,箭头标签取消贯穿,编译器还会检查穷尽性。它最适合 enum、有限集合和纯映射逻辑;复杂控制流仍应留在语句里。
文本块:多行字符串的可读写法
文本块把 SQL、JSON、HTML 从字符串拼接里解放出来,但它的规则不是「原样保留」:编译器会去掉附带空白,行尾空格和缩进都会影响结果。
从 8 / 11 迁移到 17
升级到 17 的主要成本不在新语法,而在旧假设:被移除的 RMI Activation、失效的 --illegal-access、对 JDK 内部 API 的反射访问,以及只在 21 才改变的 Security Manager 行为。
深钻模块 · 3 个主题
record 与 sealed:用 Java 写代数数据类型
record 描述「数据是什么形状」,sealed 描述「可能是哪几种形状」,模式匹配负责按形状分支。三者组合后,Java 可以表达代数数据类型,并让编译器检查分支是否穷尽。
强封装:模块边界与反射
JDK 17 的 JEP 403 把「默认拒绝」变成「一律拒绝」:classpath 上的代码不能再靠 --illegal-access=permit 反射进 JDK 内部包。理解 exports 与 opens 的差别,才能把 --add-opens 用在最小范围。
JDK 17 的 GC:G1 默认,ZGC 与 Shenandoah 转正
JDK 17 默认 G1;ZGC 与 Shenandoah 都在 15 转正,17 可以直接用于生产。三者的差别不是「谁更新」,而是停顿目标、吞吐与内存占用之间的取舍。
版本上下文JDK 17
JDK 17 于 2021-09-14 发布,class 文件版本 61,默认 G1。语言侧的五个特性跨越 14–17 转正;运行时侧的 JEP 403 强封装、JEP 407 移除 RMI Activation、JEP 411 弃用 Security Manager 决定了升级成本。ZGC 与 Shenandoah 在 15 已转正,17 可以直接使用。