❤️Java17 發佈了,YYDS!重磅!Oracle 宣佈 JDK 17 可以免費商用了。。

不過,蘋果 13 確實不那麼 13 香,庫克一如既往在擠牙膏式的更新。

對比之下,我覺得還是 JDK 17 比較香,除了新增了不少新特性,Oracle 官方竟然宣佈 JDK 17 可以免費商用了

從官方的聲明中可以看得出:Oracle JDK 17 和未來的 JDK 版本是在免費使用許可下提供的,直到下一個 LTS 版本發佈整整一年

LTS 是什麼意思呢?就是 Long-Term-Support,長期支持版本,不同於 16、15、14、13、12 這些過渡版本。

生產環境下,最常用的三個版本,就是 JDK 6、JDK 8、JDK 11,JDK 17 會不會是下一個呢?

上面這張圖是 Oracle 官方給出的 Oracle JDK 支持的時間線。可以看得到,JDK 17 最多可以支持到 2029 年 9 月份,長達 8 年!

按照技術更新迭代的速度,8 年時間,真不短了!

以 Oracle 的尿性來看,這次免費商用 8 年可謂是良苦用心,爲的就是讓使用者放心大膽地將 JDK 升級到 JDK 17。

不過,好像 JDK 8 支持的時間更長,可以延長到 2030 年 12 月。似乎我又發現了什麼真理:他強任他強,我用 Java 8

推薦一下二哥在 GitHub 上開源的《Java 程序員進階之路》專欄吧!風趣幽默、通俗易懂,對 Java 初學者極度友好和舒適😘,內容包括但不限於 Java 語法、Java 集合框架、Java IO、Java 併發編程、Java 虛擬機等核心知識點。

GitHub 地址:https://github.com/itwanger/toBeBetterJavaer

JDK 17 之前,LTS 版本都是 3 年發佈一次,11 是 2018 年,8 是 2014 年,7 是 2011 年。

之後呢,Oracle 計劃每兩年發佈一次未來的 LTS 版本,也就是說,下一個 LTS 版本,也就是 JDK 21 將於 2023 年 9 月份發佈。

技術更新迭代的速度又快了呀!

這裏強調一點哈,非長期支持版本一定不要用於生產環境,不過拿來作爲學習的對象還是可以的。

JDK 17 提供了 14 個 JEP(JDK Enhancement Proposal,JDK 增強建議),也就是 14 個新特性,我們來一睹爲快!

特性 說明
306:Restore Always-Strict Floating-Point Semantics 恢復始終執行嚴格模式的浮點定義
356:Enhanced Pseudo-Random Number Generators 增強型僞隨機數生成器
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 內部強封裝
406:Pattern Matching for switch (Preview) 爲 switch 支持模式匹配
407:Remove RMI Activation 移除 RMI 激活
409:Sealed Classes 密封類
410:Remove the Experimental AOT and JIT Compiler 移除實驗性的 AOT 和 JIT 編譯器
411:Deprecate the Security Manager for Removal 棄用安全管理器
412:Foreign Function & Memory API (Incubator) 外部函數和內存 API(孵化中)
414:Vector API (Second Incubator) 矢量 API(二次孵化中)
415:Context-Specific Deserialization Filters 上下文特定反序列化過濾器

Java 語言增強

JEP 409:密封類,密封的類和接口,可以限制其他類或接口擴展或實現它們。

public abstract sealed class Shape permits Circle{

}

類 Shape 被關鍵字 sealed 修飾,表明它是一個密封類。這個密封類必須要指定它被哪些類繼承,比如說 Circle:

public final class Circle extends Shape {
}

Circle 類必須用 final 關鍵字修飾,表明它不能再被其他類繼承了。

這個密封類就有意思了,我只允許誰誰誰繼承,就有點指定繼承權的內味了。

庫的更新和改進

JEP 306:恢復始終執行嚴格模式的浮點定義。Java 最初只有嚴格的浮點語義,但從 JDK 1.2 開始,爲了適應當時硬件架構的限制,默認情況下允許這些嚴格語義中的細微變化,而現在這些都沒有必要了。

JEP 356:增強型僞隨機數生成器。爲僞隨機數生成器 (PRNG) 提供新的接口類型和實現。

JEP 382:新的 macOS 渲染管道。 使用 Apple Metal API 爲 macOS 實現了 Java 2D 渲染管道。新管道減少了 JDK 對已棄用的 Apple OpenGL API 的依賴。

新平臺支持

JEP 391:macOS AArch64 端口。該端口允許將 Java 應用程序在新的基於 Arm 64 的 Apple Silicon 計算機上運行。

刪除和棄用

JEP 398:棄用 Applet API。Applet 是一種運行在 Web 瀏覽器內的 Java 程序,早就過時了,刪除很有必要。

JEP 407:刪除了遠程方法調用 (RMI) 激活機制。

JEP 410:刪除實驗性的 AOT 和 JIT 編譯器,這兩個實驗功能並沒有被廣泛使用,刪了省得維護。

JEP 411:棄用安全管理器。安全管理器可追溯到 Java 1.0,但多年來並沒有起到很好的保護作用,刪除了省心。

面向未來的 Java 程序

JEP 403:JDK 內部強封裝,限制外部對 JDK 內部類進行訪問,此更改會使應用程序更安全,並減少對非標準、內部 JDK 實現細節的依賴。

後續 JDK 版本的預覽和孵化器

JEP 406 : 爲 switch 支持模式匹配。

我們希望將一個變量 o 與多個備選方案進行比較,但之前的 switch 不支持使用 instanceof 的模式匹配,於是我們只能用 if-else 來實現。

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 在模式匹配的基礎上提供了 switch 語句的支持:

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();
    };
}

這樣寫是不是就瞬間高大上了許多,舒服。

JEP 412:外部函數和內存 API(孵化器)。通過有效調用外部函數(JVM 外部的代碼),並通過安全訪問外部內存,這使得 Java 程序能夠調用本機庫並處理本機數據,而沒有 Java 本機接口 (JNI) 的脆弱性和複雜性。

JEP 414:矢量 API(第二孵化器)。Vector API 由JEP 338 提出並作爲孵化 API 集成到 Java 16 中。

Vector API 旨在通過提供一種在 Java 中編寫複雜矢量算法的方法來提高矢量化計算的可預測和健壯性。許多領域都可以從這個顯式向量 API 中受益,包括機器學習、線性代數、密碼學、金融和 JDK 本身的代碼。

官方鏈接:https://www.oracle.com/news/announcement/oracle-releases-java-17-2021-09-14/


講良心話,JDK 更新的頻率是比以前更快了,但開發者的習慣仍然停留在 JDK 8 甚至 JDK 6 的層面上。

主動升級到 JDK 11 的並不多,尤其是 Oracle 搞出商業收費後,大家升級的意願就更淡了。

不知道是不是出於開源或者叫免費的壓力,JDK 17 宣佈可以免費商用了,並且打算以後的版本也保持這樣。

這對使用者來說,無疑是一罐蜜糖,長達 8 年的時間支持,也許大家會願意升級到 JDK 17 了!

大家覺得呢?

我是二哥呀,沒有什麼使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不繫之舟

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章