同學們,Oracle 宣布,從 JDK 17 開始,后面的 JDK 都全部免費提供啦!!!

是的,你沒有看錯,Oracle 這次良心了,發大招了,Java 17+ 可以免費使用了,包括商用,更詳細的條款可以閱讀:
https://www.oracle.com/downloads/licenses/no-fee-license.html
來看下最新 Oracle Java 支持路線圖:

可以看到,JDK 17 是自 2018 年 JDK 11 后的第二個長期支持版本,支持到 2029 年 9 月,好家伙,支持時間長達 8 年,這下可以不用死守 JDK 8 了,JDK 17+ 也可以是一種新的選擇了。。
下一個第三個長期支持版本是 JDK 21,時間為 2023 年 9 月,這次長期支持版本發布計划改了,不再是原來的 3 年一次,而是改成了 2 年一次!
另外,非長期支持版本還是半年發一次不變,下一個非長期支持版本計划在 2022/03 發布,但注意不要用在生產。
JDK 17 新特性一覽
ID | 特性 | 說明 |
---|---|---|
1 | 306:Restore Always-Strict Floating-Point Semantics | 恢復始終執行嚴格模式的浮點定義 |
2 | 356:Enhanced Pseudo-Random Number Generators | 增強型偽隨機數生成器 |
3 | 382:New macOS Rendering Pipeline | 新的 macOS 渲染管道 |
4 | 391:macOS/AArch64 Port | macOS AArch64 端口 |
5 | 398:Deprecate the Applet API for Removal | 棄用 Applet API |
6 | 403:Strongly Encapsulate JDK Internals | JDK 內部強封裝 |
7 | 406:Pattern Matching for switch (Preview) | 為 switch 支持模式匹配 |
8 | 407:Remove RMI Activation | 移除 RMI 激活 |
9 | 409:Sealed Classes | 密封類 |
10 | 410:Remove the Experimental AOT and JIT Compiler | 移除實驗性的 AOT 和 JIT 編譯器 |
11 | 411:Deprecate the Security Manager for Removal | 棄用安全管理器 |
12 | 412:Foreign Function & Memory API (Incubator) | 外部函數和內存 API(孵化中) |
13 | 414:Vector API (Second Incubator) | 矢量 API(二次孵化中) |
14 | 415:Context-Specific Deserialization Filters | 上下文特定反序列化過濾器 |
JDK 17 這個版本提供了 14 個增強功能,另外在性能、穩定性和安全性上面也得到了大量的提升,以及還有一些孵化和預覽特性,有了這些新變化,Java 會進一步提高開發人員的生產力。
JDK 17 新特性詳細介紹
下面是 JDK 17 中的 14 個新特性詳細介紹,分為 5 大類進行介紹!
1. 語言增強
409:Sealed Classes
密封類,這個特性在 JDK 15 中首次成為預覽特性,在 JDK 16 中進行二次預覽,在 JDK 17 這個版本中終於正式轉正了。
密封類可以用來增強 Java 編程語言,防止其他類或接口擴展或實現它們。
來看下面這個示例:
-
public abstract sealed class Student
-
permits ZhangSan, LiSi, ZhaoLiu {
-
...
-
-
}
類 Student 被 sealed
修飾,說明它是一個密封類,並且只允許指定的 3 個子類繼承。
這個牛逼啊,有了這個特性,意味着以后不是你想繼承就繼承,想實現就實現了,你得經過允許才行。轉正了,棧長會再詳細寫一篇,關注公眾號:Java技術棧,公眾號第一時間推送哦。
2. 預覽和孵化特性
406:Pattern Matching for switch (Preview)
為 switch 支持模式匹配(預覽中)
instanceof 模式匹配的概念大家都清楚吧?不清楚的可以看下這篇文章:Java 14 之模式匹配,非常贊的一個新特性!
這次在 JDK 17 中為 switch 語句支持模式匹配,是個什么鬼?來看下面的示例!
老代碼寫法:
-
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;
-
}
模式匹配新寫法:
-
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();
-
};
-
}
牛逼,直接在 switch 上支持 Object 類型,這就等於同時支持多種類型,使用模式匹配得到具體類型,大大簡化了語法量,這個功能還是挺實用的,期待轉正,棧長會再詳細寫一篇,關注公眾號:Java技術棧,公眾號第一時間推送哦。
412:Foreign Function & Memory API (Incubator)
外部函數和內存 API(孵化中)
改進了 JDK 14 和 JDK 15 引入的 API,通過有效調用外部函數(即 JVM 之外的代碼),以及安全地訪問外部內存(JVM 之外的內存),這些 API 可以調用本地庫和處理本地數據,與 Java 運行環境之外的代碼和數據進行交互。
414: Vector API (Second Incubator)
矢量 API(二次孵化中)
Vector API 這是一個新的初始迭代孵化器模塊,模塊包:jdk.incubator.vector,用於表示在運行時可靠地編譯到支持的 CPU 架構上的最佳矢量硬件指令的矢量計算,矢量運算可以提供優於等效標量計算的性能,並且在機器學習、人工智能和密碼學等領域非常普遍。
本次增強的 API 允許以一種在運行時,可靠地編譯為支持的 CPU 架構上的最佳向量指令的方式表達向量計算。
3. 核心增強
306:Restore Always-Strict Floating-Point Semantics
恢復始終執行嚴格模式的浮點定義。
Java 最初只有嚴格的浮點語義,但從 JDK 1.2 開始,為了適應當時硬件架構的限制,默認情況下允許這些嚴格語義中的細微變化,而現在這些都沒有必要了,已被 JEP 306 刪除。
356:Enhanced Pseudo-Random Number Generators
增強型偽隨機數生成器,java.util.random 包更新了,提高了不同 PRNGs(偽隨機數生成器)的互操作性,並使基於需求而不是硬編碼特定實現的算法變得容易。
這次更改包括偽隨機數生成器(PRNG)的新的接口類型和實現,包括可跳 PRNGs 和一個可拆分的 PRNG 算法(LXM),以及全新的 RandomGeneratorFactory 類。
382:New macOS Rendering Pipeline
新的 macOS 渲染管道。
這個新管道通過使用新的 Apple Metal API 為 macOS 實現 Java 2D 渲染管道,減少了 JDK 對已棄用的 Apple OpenGL API 的依賴。
415: Context-Specific Deserialization Filters
上下文特定反序列化過濾器。
允許應用配置 context-specific 和 dynamically-selected 過濾器,通過一個 JVM 范圍的過濾器工廠,用來為每個單獨的反序列化操作選擇一個過濾器。
403:Strongly Encapsulate JDK Internals
JDK 內部強封裝,它是 JDK 16 中 JEP 396 的延續,JDK 16 開始對 JDK 內部大部分元素默認進行強封裝,sun.misc.Unsafe 之類的關鍵內部 API 除外,從而限制對它們的訪問。
此外,用戶仍然可以選擇自 JDK 9 以來的默認的寬松的強封裝,這樣可以幫助用戶毫不費力地升級到未來的 Java 版本。
4. 新平台支持
391:macOS/AArch64 Port
macOS AArch64 端口,即提供可適用於 macOS 的 JDK 版本,該版本可在基於 Arm 64 的較新的 macOS 系統上本地化運行。
5. 棄用和移除項
411:Deprecate the Security Manager for Removal
棄用安全管理器。
安全管理器從 Java 1.0 開始,這些年來它一直都不是保護 Java 應用程序代碼的主要手段,也很少用於保護 Java 服務器端代碼,所以這個版本標識為棄用狀態了,未來的版本會進行移除。
398:Deprecate the Applet API for Removal
棄用 Applet API。
Applet 是一種運行在 Web 瀏覽器內的 Java 程序,但 Applet 早就沒什么鳥用了,現在還有哪款瀏覽器支持 Java Applet 的嗎?在坐的各位估計都沒聽過吧?
407:Remove RMI Activation
移除 RMI 激活。
RMI 激活機制已於 2020 年 9 月在 JDK 15 中移除了,遠程方法調用 (RMI) 激活機制現也已被移除,需要說明的是,RMI 激活是 RMI 中一個過時的組件,自 Java 8 以來一直是可選的。
410:Remove the Experimental AOT and JIT Compiler
移除實驗性的 AOT 和 JIT 編譯器。
AOT 和 JIT 這兩個實驗性的編譯器,自從在 JDK 9 中引入以來幾乎沒有怎么使用,市面上也出現了更為廣泛使用的替代方案,並且維護它們所需的工作量很大,所以在 JDK 16 中就已經刪除了,本次從 OpenJDK 項目中刪除了源代碼。
JDK 17 都免費了,和 OpenJDK 還有區別?
有的,雖然兩者很接近,但也還是有一點區別!
1、Oracle JDK 提供了各種安裝程序,還包含更新規則,而 OpenJDK 只提供了一個純壓縮包;
2、Usage Logging 僅在 Oracle JDK 中可用;
3、Oracle JDK 要求第三方加密提供程序使用 Java 加密擴展(JCE)進行簽名,而 OpenJDK 繼續允許使用未簽名的第三方加密提供程序;
4、java -version 的輸出也是不同的,Oracle JDK 返回 java 並包含 Oracle 特定的標識符,OpenJDK 返回 OpenJDK 並且不包含特定於 Oracle 的標識符;
5、許可證不同,Oracle JDK 17+ 是根據 Oracle 免費條款和條件許可發布的,而 OpenJDK 在 GPLv2wCP 下發布的;
6、Oracle JDK 源代碼含有 "ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.",其使用受許可條款約束的,而 OpenJDK 源代碼可參考 GPL 許可條款;
以上是兩者最主要的 6 點區別。
總結
Java 17 發布了,Oracle 宣布 JDK 17 及之后的版本都免費使用,包括商用,爽!!!Oracle 這次真的良心了,或許是趨於某種壓力進行免費?
Java 確實是在走下坡路,即使如此,也是老當益壯,是現在各大企業必用的語言之一。
雖然大部分人現在還在用着 JDK 7/8,甚至 6,還在寫着 JDK 5 的語法,現在隨着 JDK 17+ 的免費,或者在未來的不久,JDK 8 會逐漸被替代,JDK 17+ 慢慢走上舞台。