重磅!JDK 17 發(fā)布,Oracle 宣布 JDK 17 可以免費(fèi)商用了。。
果然,JDK 17 還是如期發(fā)布了,2021年09月14日。巧了,和蘋果發(fā)布會(huì)是一天,不知道是不是互相在蹭熱度,哈哈哈~~~
不過(guò),蘋果 13 確實(shí)不那么 13 香,庫(kù)克一如既往在擠牙膏式的更新。
對(duì)比之下,我覺(jué)得還是 JDK 17 比較香,除了新增了不少新特性,Oracle 官方竟然宣布 JDK 17 可以免費(fèi)商用了!

從官方的聲明中可以看得出:Oracle JDK 17 和未來(lái)的 JDK 版本是在免費(fèi)使用許可下提供的,直到下一個(gè) LTS 版本發(fā)布整整一年。
LTS 是什么意思呢?就是 Long-Term-Support,長(zhǎng)期支持版本,不同于 16、15、14、13、12 這些過(guò)渡版本。
生產(chǎn)環(huán)境下,最常用的三個(gè)版本,就是 JDK 6、JDK 8、JDK 11,JDK 17 會(huì)不會(huì)是下一個(gè)呢?

上面這張圖是 Oracle 官方給出的 Oracle JDK 支持的時(shí)間線??梢钥吹玫剑琂DK 17 最多可以支持到 2029 年 9 月份,長(zhǎng)達(dá) 8 年!
按照技術(shù)更新迭代的速度,8 年時(shí)間,真不短了!
以 Oracle 的尿性來(lái)看,這次免費(fèi)商用 8 年可謂是良苦用心,為的就是讓使用者放心大膽地將 JDK 升級(jí)到 JDK 17。
不過(guò),好像 JDK 8 支持的時(shí)間更長(zhǎng),可以延長(zhǎng)到 2030 年 12 月。似乎我又發(fā)現(xiàn)了什么真理:他強(qiáng)任他強(qiáng),我用 Java 8 !
JDK 17 之前,LTS 版本都是 3 年發(fā)布一次,11 是 2018 年,8 是 2014 年,7 是 2011 年。
之后呢,Oracle 計(jì)劃每?jī)赡臧l(fā)布一次未來(lái)的 LTS 版本,也就是說(shuō),下一個(gè) LTS 版本,也就是 JDK 21 將于 2023 年 9 月份發(fā)布。
技術(shù)更新迭代的速度又快了呀!
這里強(qiáng)調(diào)一點(diǎn)哈,非長(zhǎng)期支持版本一定不要用于生產(chǎn)環(huán)境,不過(guò)拿來(lái)作為學(xué)習(xí)的對(duì)象還是可以的。
JDK 17 提供了 14 個(gè) JEP(JDK Enhancement Proposal,JDK 增強(qiáng)建議),也就是 14 個(gè)新特性,我們來(lái)一睹為快!
| 特性 | 說(shuō)明 |
|---|---|
| 306:Restore Always-Strict Floating-Point Semantics | 恢復(fù)始終執(zhí)行嚴(yán)格模式的浮點(diǎn)定義 |
| 356:Enhanced Pseudo-Random Number Generators | 增強(qiáng)型偽隨機(jī)數(shù)生成器 |
| 382:New macOS Rendering Pipeline | 新的 macOS 渲染管道 |
| 391:macOS/AArch64 Port | macOS AArch64 端口 |
| 398:Deprecate the Applet API for Removal | 棄用 Applet API |
| 403:Strongly Encapsulate JDK Internals | JDK 內(nèi)部強(qiáng)封裝 |
| 406:Pattern Matching for switch (Preview) | 為 switch 支持模式匹配 |
| 407:Remove RMI Activation | 移除 RMI 激活 |
| 409:Sealed Classes | 密封類 |
| 410:Remove the Experimental AOT and JIT Compiler | 移除實(shí)驗(yàn)性的 AOT 和 JIT 編譯器 |
| 411:Deprecate the Security Manager for Removal | 棄用安全管理器 |
| 412:Foreign Function & Memory API (Incubator) | 外部函數(shù)和內(nèi)存 API(孵化中) |
| 414:Vector API (Second Incubator) | 矢量 API(二次孵化中) |
| 415:Context-Specific Deserialization Filters | 上下文特定反序列化過(guò)濾器 |
Java 語(yǔ)言增強(qiáng)
JEP 409:密封類,密封的類和接口,可以限制其他類或接口擴(kuò)展或?qū)崿F(xiàn)它們。
public abstract sealed class Shape permits Circle{
}
類 Shape 被關(guān)鍵字 sealed 修飾,表明它是一個(gè)密封類。這個(gè)密封類必須要指定它被哪些類繼承,比如說(shuō) Circle:
public final class Circle extends Shape {
}
Circle 類必須用 final 關(guān)鍵字修飾,表明它不能再被其他類繼承了。
這個(gè)密封類就有意思了,我只允許誰(shuí)誰(shuí)誰(shuí)繼承,就有點(diǎn)指定繼承權(quán)的內(nèi)味了。
庫(kù)的更新和改進(jìn)
JEP 306:恢復(fù)始終執(zhí)行嚴(yán)格模式的浮點(diǎn)定義。Java 最初只有嚴(yán)格的浮點(diǎn)語(yǔ)義,但從 JDK 1.2 開(kāi)始,為了適應(yīng)當(dāng)時(shí)硬件架構(gòu)的限制,默認(rèn)情況下允許這些嚴(yán)格語(yǔ)義中的細(xì)微變化,而現(xiàn)在這些都沒(méi)有必要了。
JEP 356:增強(qiáng)型偽隨機(jī)數(shù)生成器。為偽隨機(jī)數(shù)生成器 (PRNG) 提供新的接口類型和實(shí)現(xiàn)。
JEP 382:新的 macOS 渲染管道。使用 Apple Metal API 為 macOS 實(shí)現(xiàn)了 Java 2D 渲染管道。新管道減少了 JDK 對(duì)已棄用的 Apple OpenGL API 的依賴。
新平臺(tái)支持
JEP 391:macOS AArch64 端口。該端口允許將 Java 應(yīng)用程序在新的基于 Arm 64 的 Apple Silicon 計(jì)算機(jī)上運(yùn)行。
刪除和棄用
JEP 398:棄用 Applet API。Applet 是一種運(yùn)行在 Web 瀏覽器內(nèi)的 Java 程序,早就過(guò)時(shí)了,刪除很有必要。
JEP 407:刪除了遠(yuǎn)程方法調(diào)用 (RMI) 激活機(jī)制。
JEP 410:刪除實(shí)驗(yàn)性的 AOT 和 JIT 編譯器,這兩個(gè)實(shí)驗(yàn)功能并沒(méi)有被廣泛使用,刪了省得維護(hù)。
JEP 411:棄用安全管理器。安全管理器可追溯到 Java 1.0,但多年來(lái)并沒(méi)有起到很好的保護(hù)作用,刪除了省心。
面向未來(lái)的 Java 程序
JEP 403:JDK 內(nèi)部強(qiáng)封裝,限制外部對(duì) JDK 內(nèi)部類進(jìn)行訪問(wèn),此更改會(huì)使應(yīng)用程序更安全,并減少對(duì)非標(biāo)準(zhǔn)、內(nèi)部 JDK 實(shí)現(xiàn)細(xì)節(jié)的依賴。
后續(xù) JDK 版本的預(yù)覽和孵化器
JEP 406 : 為 switch 支持模式匹配。
我們希望將一個(gè)變量 o 與多個(gè)備選方案進(jìn)行比較,但之前的 switch 不支持使用 instanceof 的模式匹配,于是我們只能用 if-else 來(lái)實(shí)現(xiàn)。
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
JDK 17 在模式匹配的基礎(chǔ)上提供了 switch 語(yǔ)句的支持:
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
這樣寫(xiě)是不是就瞬間高大上了許多,舒服。
JEP 412:外部函數(shù)和內(nèi)存 API(孵化器)。通過(guò)有效調(diào)用外部函數(shù)(JVM 外部的代碼),并通過(guò)安全訪問(wèn)外部?jī)?nèi)存,這使得 Java 程序能夠調(diào)用本機(jī)庫(kù)并處理本機(jī)數(shù)據(jù),而沒(méi)有 Java 本機(jī)接口 (JNI) 的脆弱性和復(fù)雜性。
JEP 414:矢量 API(第二孵化器)。Vector API 由JEP 338 提出并作為孵化 API 集成到 Java 16 中。
Vector API 旨在通過(guò)提供一種在 Java 中編寫(xiě)復(fù)雜矢量算法的方法來(lái)提高矢量化計(jì)算的可預(yù)測(cè)和健壯性。許多領(lǐng)域都可以從這個(gè)顯式向量 API 中受益,包括機(jī)器學(xué)習(xí)、線性代數(shù)、密碼學(xué)、金融和 JDK 本身的代碼。
官方鏈接:https://www.oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/
講良心話,JDK 更新的頻率是比以前更快了,但開(kāi)發(fā)者的習(xí)慣仍然停留在 JDK 8 甚至 JDK 6 的層面上。
主動(dòng)升級(jí)到 JDK 11 的并不多,尤其是 Oracle 搞出商業(yè)收費(fèi)后,大家升級(jí)的意愿就更淡了。
不知道是不是出于開(kāi)源或者叫免費(fèi)的壓力,JDK 17 宣布可以免費(fèi)商用了,并且打算以后的版本也保持這樣。
這對(duì)使用者來(lái)說(shuō),無(wú)疑是一罐蜜糖,長(zhǎng)達(dá) 8 年的時(shí)間支持,也許大家會(huì)愿意升級(jí)到 JDK 17 了!
大家覺(jué)得呢?
我是二哥呀,沒(méi)有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧?kù)o的港灣,我是不系之舟。
推薦閱讀:
