写了一段用
jpackage打包的脚本,顺手加了个 macOS.dmg输出——那一刻我觉得,Java 越来越好用了。
2024 年 3 月 19 日,JDK 22 正式发布。作为 JDK 21 这个 LTS 版本之后的第一个短期版本,它的生命周期只有半年。很多人会觉得这种只有半年生命周期的临时版本,没有太大的用处。但是我觉得:正是因为它们,后续的LTS版本才能伟大。它也代表了 Java 社区正在认真在为开发者考虑开发体验。
虽然这次更新没有虚拟线程那么大的更新,也没有 LTS 的光环,JDK 22 的改进都藏在细节里:一个能省掉无用参数的 _,一个更安全的字符串插值机制,还有打包工具的小升级。这些改动不大,但用起来就是舒服。
所有特性均基于 JSR 397(《Java SE 22 发布规范》)。作为一个典型的短期版本,它主要聚焦:
_(预览,JEP 456)这个特性解决了一个我忍了很久的小问题:Lambda 表达式的参数根本用不到,却不得不命名。
比如注册一个定时任务,我只关心执行逻辑,不关心 TimerTask 对象:
// 以前
timer.schedule(new TimerTask() {
public void run() { log("tick"); }
}, delay);
// 用 Lambda
timer.schedule(t -> log("tick"), delay); // t 是个摆设
// 现在
timer.schedule(_ -> log("tick"), delay); // 清晰表明“我不需要这个参数”_ 的引入,不只是省了几个字母,更是显式表达了意图。看到 _,你就知道这部分信息无关紧要。当然,规则也很明确:不能和命名参数混用,避免混淆。
💡 注意:该特性在 JDK 22 中处于预览阶段,需使用
--enable-preview编译和运行。
这是 JDK 22 里我最想强调的一点:Foreign Function & Memory API 终于毕业了。
从 JDK 19 开始,它经历了三轮孵化,现在在 JDK 22 中成为标准 Java API。这意味着,我们有了一个安全、高效、纯 Java 的方式来调用本地代码(C/C++ 库)和操作堆外内存,而不再需要依赖脆弱且复杂的 JNI。
虽然我自己写 Web 服务时很少直接用到它,但它的正式发布意义重大。数据库驱动、机器学习框架、游戏引擎等需要与本地库深度交互的领域,从此有了一个现代化、高性能的官方解决方案。JNI 的漫长统治,终于看到了被取代的曙光。
JDK 22 带来了更安全、更灵活的字符串插值机制——String Templates。
传统字符串拼接容易出错,而 String.format 又冗长。现在你可以这样写:
// 预览特性,需启用 --enable-preview
String name = "Alice";
int age = 30;
String message = STR."Hello, \{name}! You are \{age} years old.";更强大的是,它支持自定义处理器。例如,安全地构建 SQL 查询:
PreparedStatement ps = DB."SELECT * FROM users WHERE id = \{userId}";这里的 DB 处理器可以自动转义输入,防止 SQL 注入。这不仅是语法糖,更是安全编程的新范式。
_ 和字符串模板虽小,却能显著减少样板代码,提升可读性与安全性。jpackage 增强,Java 依然在认真维护整个开发生命周期。void main() { ... },省掉类声明,适合脚本或教学。jpackage 增强:支持生成 macOS .dmg 安装包,Windows 安装程序自定义能力也更强(注:此为工具链改进,未列为独立 JEP)。JDK 22 通过 JSR 397,完成了一次典型的“润物细无声”式迭代。它没有颠覆性创新,却在语言表达力、工具链和底层能力上做了大量扎实的打磨。匿名变量 _ 让代码更简洁,字符串模板让插值更安全,FFM API 的正式发布则为系统级编程打开新大门。这些看似微小的改进,累积起来就是日常开发体验的质变。作为 JDK 21 的直接后继者,JDK 22 再次证明:Java 的演进,不仅是关于性能和并发,更是关于如何让每一位开发者写代码时,感觉更自然、更顺手。
[1] JSR 397: Java SE 22 规范: https://www.jcp.org/en/jsr/detail?id=397
[2] OpenJDK JDK 22 官方页面: https://openjdk.org/projects/jdk/22/
[3] JEP 456: Unnamed Variables & Patterns (Preview): https://openjdk.org/jeps/456
[4] JEP 459: String Templates (Second Preview): https://openjdk.org/jeps/459
[5] JEP 454: Foreign Function & Memory API: https://openjdk.org/jeps/454