JDK 25现在处于候选发布阶段,build 35作为候选发布。这意味着build 35将是9月份的JDK 25 realease,除非有任何令人震惊的bug。
特征
- 470:加密对象的 PEM 编码(预览)
- 502:稳定值(预览)
- 503:删除 32 位 x86 端口
- 505:结构化并发(第五个预览)
- 506:范围值
- 507:模式中的原始类型、instanceof 和 switch(第三次预览)
- 508:Vector API(第十孵化器)
- 509:JFR CPU 时间分析(实验)
- 510:密钥派生函数 API
- 511:模块导入声明
- 512:压缩源文件和实例主要方法
- 513:灵活的构造函数主体
- 514:提前命令行人体工程学
- 515:提前方法分析
- 518:JFR合作采样
- 519:紧凑对象头
- 520:JFR 方法计时与追踪
- 521:Generational Shenandoah
JDK 25又发明了轮子,但这次是六边形的
JDK 25 一上来就宣布:“我们引入了 PEM 编码的预览 API!” 啥?PEM?就是那个连加密狗都懒得用的古老格式?你是不是以为 Java 终于要进军区块链或者加密货币了?别激动,冷静。这其实就像是你家祖传的腌菜坛子,终于被官方认证可以放进博物馆了。现在,你的密钥和证书终于可以像老式电报一样,用一串“-----BEGIN CERTIFICATE-----”开头的 ASCII 艺术品来展示了。是的,复古风潮已经吹到了 Java 的加密层,仿佛在说:“看,我们也很潮,我们支持 Base64 编码的艺术!”
紧随其后的是“稳定值(Stable Values)”,又一个预览 API。官方说它能让 JVM 把对象当常量优化,性能更好。听起来很厉害?但别忘了,它前面还挂着个“(Preview)”。这意味着什么?意味着这玩意儿就像你公司食堂新推出的“健康餐”——今天说好明天可能就没了,或者后天换了个名儿又回来,但味道已经变了。Java 的语言特性现在走的是“先尝后买,概不退换”的路子,反正社区的反馈?那都是“优化建议”,改不改,全看 Oracle 的心情。
然后是“结构化并发”的第五次预览。第五次!朋友们,这已经不是预览了,这是“无限续杯”。这就像一个永远在 beta 测试的游戏,开发者说:“这次真的稳定了!” 结果你一更新,发现登录界面又换了。结构化并发本意是让多线程编程更简单,但现在看来,它自己才是那个最需要被“结构化”的部分。什么时候它能从“预览”变成“正式”?也许等 Java 支持量子计算的时候吧。
但真正让我笑出声的是“作用域值(Scoped Values)”。官方说它比线程局部变量(ThreadLocal)更好,更安全,性能更高。我只想问一句:那之前那么多用 ThreadLocal 写的代码,是不是都成了“历史的垃圾”?这就像你刚教会你爸用智能手机,他终于学会了微信发红包,结果你告诉他:“爸,现在都用脑机接口了,您那手机过时了。” 他一脸懵逼地看着你,就像我们看着 JDK 不断废弃旧 API 时的表情。
还有“紧凑源文件和实例主方法”,这简直是给初学者的“婴儿学步车”。现在你写个 Hello World 不用再写 public static void main(String args)
了,可以直接写个 main()
。哦,太感动了,Java 终于意识到,不是每个程序员都想当架构师,有些人只想快速打印个“你好,世界”。这进步,就像是从马车进化到了自行车——虽然慢,但至少不用喂马了。
最离谱的是“灵活的构造函数体”。现在你可以在 super()
之前写代码了!这有什么大不了的?大不了的是,这打破了 Java 二十多年来的“先调父类,再干别的”铁律。这就像你一直被告知吃饭要先洗手,结果某天专家说:“其实先吃饭再洗手也行,只要饭前手不脏。” 嗯,逻辑上没错,但总感觉哪里怪怪的。
废弃与移除
如果说新功能是“我们又有了新欢”,那废弃功能就是“旧爱必须死”。
JDK 25 大手一挥,移除了好几个老古董。比如,那个可以创建数据报套接字的 Socket
构造函数,终于被扔进了历史的垃圾桶。官方说:“别用了,用 DatagramSocket
。” 好吧,这就像你一直用剪刀开快递,现在厂家说:“对不起,剪刀不环保,以后都用手撕。” 问题是,我手撕得动吗?
更绝的是,UseCompressedClassPointers
这个选项被废弃了。官方解释说,未压缩模式基本没人用,还占内存,所以干脆删了。这逻辑很“Java”——我们只保留我们认为你应该用的东西,至于你为什么用那个被删的,不重要。这就像你家的冰箱,有一天你发现冷冻室被焊死了,理由是:“调查显示99%的用户只用冷藏室。”
最讽刺的是,一大批权限类被标记为“废弃以移除”,比如 FilePermission
、RuntimePermission
等等。原因?因为安全管理器(Security Manager)被抛弃了。这就像一个城堡,把守卫全解雇了,然后说:“既然没人守门了,那门锁也没用了,拆了吧!” 结果就是,整个城堡的防御体系瞬间归零,只留下一句轻描淡写的:“反正现在没人来偷。”
修复与改动——我们修好了这个 bug,但可能制造了十个新 bug
JDK 25 修复了很多问题。比如,ZGC 现在不会对短命字符串去重了,G1 垃圾回收减少了停顿时间峰值。听起来很棒?但别忘了,这些优化都是在“你的应用符合我们的理想模型”的前提下才成立的。如果你的应用偏偏就是那个“不符合”的例外,那恭喜你,你将有幸成为下一个 bug 报告的主角。
还有一个改动让我笑出了声:File.delete
在 Windows 上不再删除只读文件了。之前它会偷偷去掉只读属性再删,现在不行了,必须你自己先去掉。官方说这是为了“原子性”,避免删到一半失败导致文件属性被改但文件还在。这理由很充分,但实际效果呢?无数老旧的构建脚本、自动化工具将在升级后突然“罢工”,然后开发者们将开始一场盛大的“找茬”游戏,直到有人发现:“哦,原来是 JDK 25 认真了。”
还有,空路径名现在被视为当前目录了。这修复了长期存在的不一致问题。但你猜怎么着?那些依赖旧行为的代码,现在可能会产生意想不到的结果。Java 就像一个固执的老师,坚持认为“正确”的做法只有一种,至于你之前是怎么错的,那都是你的问题。
极客热评:
紧凑的对象头变得稳定可能是我最期待的特性。更低的内存占用,而不必接触任何代码是非常可怕的。
我希望Vector API能被推广到实验阶段。但话又说回来,我更希望他们在发布之前尽可能地完善它,而不是匆忙发布。
稳定值的忠实粉丝,可能是我经常使用的功能之一。