首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《Java 演进之路》系列 · 第 11 篇

《Java 演进之路》系列 · 第 11 篇

作者头像
DevLlama
发布2026-06-01 20:13:47
发布2026-06-01 20:13:47
1020
举报

密封类初探:类型系统的精准控制与 Java 的表达力进化

“好的类型系统不是限制你,而是帮你更清晰地表达意图。”

JDK 15 是 2020 年 9 月更的,那会儿我正好在维护一个老项目里的 AST 结构,被折磨得有点上头。节点类型全靠一个公共接口加一堆注释约束,谁接手都敢随便加个实现类,写 switch 的时候我总在心里犯嘀咕:万一漏了类型,线上直接炸。结果 JDK 15 一发布,密封类直接撞我脸上——我当时真差点拍桌子:Java 总算肯在语法层面承认一件事:有些继承关系,就不该对外开放。

其实 JDK 14 出 Records、模式匹配预览版的时候,我就觉得 Java 有点开窍了。但密封类不一样,它不是那种看着花里胡哨的语法糖,更像是类型系统迟到的一次补课。虽然那会儿还只是预览版,跑代码必须加 --enable-preview,但那种“终于能把设计意图写死在代码里”的感觉,真的爽翻了。这个版本不是 LTS,生命周期也就半年,但它埋下的东西,后来在 JDK 17 直接长成了主力特性。


📌 JDK 15 官方特性总览

JDK 15 整套更新都基于 JSR 390。整体用下来的感受就是:轻重分得特别清楚。把文本块这种天天写代码都要用的东西直接转正,又把密封类这种影响深远的特性放预览里慢慢磨。ZGC 也终于不偏心 Linux 了,macOS、Windows 开发者也能跟着爽。说白了,这版本没堆一堆没人用的 API,干的全是一线开发者真能用上的事


1. 文本块(正式特性,JEP 378)

我等文本块转正,真的等太久了,久到快忘了当初有多痛苦。以前拼个 JSON、SQL、HTML,光是处理 \n 换行、\" 转义就够喝一壶。三行业务逻辑,两行在跟字符串较劲,心态很容易崩。有了文本块之后直接变成这样:

代码语言:javascript
复制
String html = """
    <html>
        <body>
            <p>Hello, world!</p>
        </body>
    </html>
    """;

干净、直观,缩进都给你对齐好。再配上 .formatted() 做插值,比以前拼字符串安全太多。当然也不是完美无缺,比如末尾多一个看不见的换行,你可能得加个 \ 去压制,有点小别扭。但跟以前那种“写一行字符串要调试三分钟”的日子比,已经是天上地下。

📌 意义:文本块正式化,本质就是 Java 终于认了:多行字符串不应该是开发者的日常负担。它算不上什么高大上的特性,但天天写模板、SQL、配置的人,用一次就离不开。

2. 密封类(预览特性,JEP 360)

JDK 15 里,我最上头的就是它,没有之一。举个最真实的场景:你要建模一组数学表达式,只能是常量、加法、乘法这几种,不允许外面随便扩展。在密封类出来之前,你只能写个接口 Expr,然后靠文档、靠口口相传、靠包权限去约束。但这些都不是强约束,只要有人不守规矩,直接破防。有了密封类就简单粗暴多了:

代码语言:javascript
复制
public sealed interface Expr
    permits ConstantExpr, AddExpr, MultiplyExpr {}

子类必须显式声明,且只能是你 permits 的那几个,编译器直接帮你把关。我当时就在那个 DSL 解析器里直接用上了,效果立竿见影:AST 结构一眼看懂,后续用 switch 处理的时候,心里踏实特别多。代码量直接少了将近一半,新人来接手也不用听我叭叭半天讲设计——类型本身就把意图说清楚了。唯一有点坑的是,那会儿还没有完整的 switch 穷尽性检查,只能算半爽。

📌 意义:密封类的目的不是锁死继承,而是让类型体系更诚实。它跟 Records、模式匹配凑一块儿,就是 Java 走向代数数据类型 ADT 的关键一步。也是 Java 第一次,从语言层面真正理解“封闭类型集合”这件事。

3. 隐藏类(正式特性,JEP 371)

这个特性,说实话,业务开发我几乎没直接写过。但对 Spring、Hibernate 这种框架底层,简直是救命级优化。以前框架运行时生成代理类,基本都靠自定义 ClassLoader,问题也很明显:类加载进去就很难卸载,时间一长元空间很容易吃满。我们线上真就因为这个,出过好几次 Metaspace OOM。隐藏类出来就解决了这个痛点:生命周期短、不能被普通反射发现、GC 可以连带元数据一起回收。其实 JVM 内部早就用它来实现 lambda 了,只不过 JDK 15 才正式开放出来。你可能这辈子都不会写 defineHiddenClass 这行代码,但你天天用的框架,都在偷偷受益。

4. ZGC 支持 macOS 和 Windows(正式特性,JEP 377 & JEP 378)

ZGC 从 JDK 11 开始,在 Linux 上就是低延迟神器,停顿时间基本可以忽略。但你想在 macOS 上调试?Windows 上本地跑?想都别想。JDK 15 直接把 ZGC 干到全平台。虽然默认还是 G1,但只要加个 -XX:+UseZGC,你在 MacBook 上就能体验亚毫秒级 GC。对生产环境影响其实不算特别大,毕竟服务器大多还是 Linux。但对本地开发体验是真的提升巨大——终于不用为了测个 ZGC 专门开 Linux 虚拟机。我之前就为了复现一个 GC 问题,在 Mac 上折腾一整天,最后还是切 Docker 才搞定,那种痛苦真不想再来一次。


🧩 为什么关注 JDK 15?

  • • 它是非 LTS 版本,生命周期很短,大部分企业直接跳过奔 JDK 17 了。
  • • 但它是现代 Java 的关键转折点:文本块正式落地,密封类首次亮相,Records 第二轮预览,这仨凑一起就是现在 Java 编码的核心手感。
  • • 平台能力补齐:ZGC 全平台、隐藏类正式化,JVM 对云原生、动态类生成更友好。
  • • 更重要的是方向感:从 JDK 14 到 15,Java 路线特别清晰——用更少代码,表达更精确的意图

🧱 其他重要平台增强

  • JEP 383: Foreign-Memory Access API (Second Incubator):属于 Panama 项目的一部分,让 Java 能安全访问堆外内存。离真正替代 JNI 还远,但至少方向是对的。
  • JEP 384: Records (Second Preview):主要是小修小补,支持局部 record、调整了注解规则,为 JDK 16 正式上线铺路。
  • JEP 385: Deprecate RMI Activation:这玩意儿早就没人用了,标记废弃、准备清理,早点删掉少点技术债。

✅ 总结

回头再看 JDK 15,它没有什么轰动全网的大特性,但每一刀都切在真实痛点上:让字符串不用再恶心人,让类型边界能写死在代码里,让 ZGC 在任何平台都能随便用,让运行时生成的类不再偷偷吃掉元空间。我自己在那个 DSL 项目里,用密封类 + Records 重构 AST 之后,代码干净到自己都惊讶。虽然那会儿还得开预览模式,但那种 “Java 终于听懂我想表达什么” 的感觉,特别难得。JDK 15 本身可能只是个过渡版本,很快就被大家忘掉。但它验证出来的这条路——更精确、更简洁、更安全,已经变成我们今天写 Java 的日常。


📢 延伸阅读建议

  • • JSR 390: Java SE 15 规范[1]
  • • OpenJDK JDK 15 官方页面[2]
  • • JEP 378: Text Blocks[3]
  • • JEP 360: Sealed Classes (Preview)[4]
  • • JEP 371: Hidden Classes[5]
引用链接

[1] JSR 390: Java SE 15 规范: https://www.jcp.org/en/jsr/detail?id=390 [2] OpenJDK JDK 15 官方页面: https://openjdk.org/projects/jdk/15/ [3] JEP 378: Text Blocks: https://openjdk.org/jeps/378 [4] JEP 360: Sealed Classes (Preview): https://openjdk.org/jeps/360 [5] JEP 371: Hidden Classes: https://openjdk.org/jeps/371

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevLlama 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 密封类初探:类型系统的精准控制与 Java 的表达力进化
  • 📌 JDK 15 官方特性总览
    • 1. 文本块(正式特性,JEP 378)
    • 2. 密封类(预览特性,JEP 360)
    • 3. 隐藏类(正式特性,JEP 371)
    • 4. ZGC 支持 macOS 和 Windows(正式特性,JEP 377 & JEP 378)
  • 🧩 为什么关注 JDK 15?
  • 🧱 其他重要平台增强
  • ✅ 总结
  • 📢 延伸阅读建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档