JDK 25正式發(fā)布了,但是我只想吐槽
昨天,JDK 25 正式發(fā)布了。
圖片
作為繼 JDK 21 之后的下一個長期支持(LTS)版本,按理說,它應該承載著社區(qū)對“穩(wěn)、重、實”的期待——性能更強、生態(tài)更穩(wěn)、特性更實用??涩F(xiàn)實是……我盯著更新日志看了三遍,最后默默關掉了瀏覽器,罵了一句:XXX的。
如果真沒東西發(fā),其實……可以不發(fā)的。(不知道有些個在吹JDK 25的博主在興奮個什么勁???)
Java 的“輕量化”,從縮寫開始?
大家都知道,Java 一直被詬病“臃腫”、“啰嗦”、“儀式感過重”。于是 Oracle 和 OpenJDK社區(qū)這幾年一直在喊“簡化語法”、“降低門檻”、“擁抱新手”。
可你猜他們怎么“簡化”的?
圖片
public static void main(String[] args) 現(xiàn)在可以寫成void main()了!- 不想寫
class?現(xiàn)在可以省略顯式類聲明了! - 嫌
System.out.println太長?現(xiàn)在可以用IO.println了! import 都懶得寫?現(xiàn)在自動導入 java.base和import module了!
……我服了。
這不叫“輕量化”,這叫“縮寫大賽”。
你把 main 函數(shù)從 36 個字符縮到 9 個字符,Java 就變輕了?新手看到 void main() 就突然覺得 Java 親切了?他們連“類”是什么都還沒搞懂,你省略 class 聲明是怕他們被嚇跑嗎?
這就像你給一輛坦克裝了個粉色貼紙,然后說:“看,現(xiàn)在它很可愛,適合女生開?!?/span>
語法糖不是罪,但拿糖當飯吃,就是逃避現(xiàn)實。
真正有價值的特性?也就兩個,還一個沒轉(zhuǎn)正
說實話,JDK 25 并非一無是處。
結(jié)構(gòu)化并發(fā)(Structured Concurrency) 和 作用域值(Scoped Values) 這兩個特性,確實是奔著解決現(xiàn)代并發(fā)編程痛點去的。
圖片
尤其是 Scoped Values —— 它是為了替代 ThreadLocal 而生的,解決內(nèi)存泄漏、性能開銷、虛擬線程兼容性差等老問題。在虛擬線程(Virtual Threads)成為主流的今天,這個特性可以說是“剛需”。
class Framework {
private static final ScopedValue<FrameworkContext> CONTEXT
= ScopedValue.newInstance(); // (1)
void serve(Request request, Response response) {
var context = createContext(request);
where(CONTEXT, context) // (2)
.run(() -> Application.handle(request, response));
}
public PersistedObject readKey(String key) {
var context = CONTEXT.get(); // (3)
var db = getDBConnection(context);
db.readKey(key);
}
}可惜,結(jié)構(gòu)化并發(fā)目前還是預覽版,你得加 --enable-preview 才能用。而作用域值雖然正式了,但孤掌難鳴——沒有結(jié)構(gòu)化并發(fā)的配合,它的威力大打折扣。
一個 LTS 版本,核心亮點居然是“孤木難支”的作用域值?這就像你去吃滿漢全席,結(jié)果主菜是一盤涼拌黃瓜。
JVM 層面?隔靴搔癢罷了
JVM 這次也不是完全沒動:
- JFR(Java Flight Recorder)做了一些性能優(yōu)化;
- AOT(Ahead-of-Time Compilation)支持更完善了一點;
- Shenandoah GC 終于支持分代了!
……等等,Shenandoah 支持分代了?
對,你沒看錯。
就在我們剛背完八股文:“ZGC 和 Shenandoah 是不分代的 GC”之后,官方突然說:“哎,我們改主意了,分代真香?!?/span>
這不是技術演進,這是對面試者的“精準打擊”。
你花三個月準備面試,背了 GC 原理、分代優(yōu)劣、ZGC 特性,結(jié)果新版本一發(fā)布,你背的東西過時了。這不是進步,這是“版本陷阱”。
而且,Shenandoah 的分代支持目前還很初級,性能表現(xiàn)遠不如 G1 成熟。這種“半成品上桌”的行為,實在讓人懷疑:是為了趕 LTS 時間表,還是真覺得“有總比沒有好”?
LTS 的意義,不該是“湊數(shù)”
LTS(Long-Term Support)版本,本應是企業(yè)級應用的“定海神針”。它意味著穩(wěn)定、可靠、長期維護、值得升級。
可 JDK 25 給我的感覺是——為了 LTS 而 LTS。
沒有顛覆性的性能提升,沒有革命性的語言特性,沒有生態(tài)級的工具革新。有的只是語法縮寫、導入簡化、GC 小修小補。
我甚至懷疑,選 JDK 25 當 LTS,是因為“25”是哪個項目經(jīng)理的幸運數(shù)字。
Java到底還有沒有未來?
我不是在否定 Java。恰恰相反,我熱愛這門語言,但正因為如此,我們才更應該對它的演進保持高標準。
Java 不需要靠“少敲幾個字母”來吸引新手。Python、JavaScript、Go、Rust 早就把“簡潔”玩明白了。Java 的優(yōu)勢從來不是“短”,而是“穩(wěn)、強、全”。
我們真正需要的是:
- 更高效的并發(fā)模型(結(jié)構(gòu)化并發(fā)請快點轉(zhuǎn)正?。?/span>
- 更智能的 GC(分代不是終點,低延遲才是)
- 更強大的模式匹配(別再只支持 switch 了)
- 更徹底的模塊化(JPMS 到底什么時候能普及?)
- 更友好的原生編譯支持(GraalVM 何時能成標配?)
Java 正站在一個關鍵的十字路口。
一邊是云原生、虛擬線程、高并發(fā)、低延遲的未來;一邊是語法糖、縮寫、自動導入的“偽優(yōu)化”。
我們不反對簡化,但簡化應該是降低認知負擔,而不是減少字符數(shù)量。
我們不反對創(chuàng)新,但創(chuàng)新應該是解決真實痛點,而不是迎合表面需求。
JDK 25,作為 LTS,本可以做得更好。
希望下一個 LTS,能讓我們真正興奮起來。而不是……讓大家更加堅定繼續(xù)用Java 8!























