1. 程式人生 > >Java 11 正式發布!

Java 11 正式發布!

icon 調整 file 免費 syntax 動態 階段 個人開發 記錄器

技術分享圖片

有多少語言在提刀想反超 Java 的路上?但萬萬沒想到,人家並未當回事,如今這款常青藤甚至越跑越歡,當我們還在使用 Java 7/8 時,它已經一路跑到了 11。

和預期的時間差不多,北京時間 9 月 26 日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發布,可供生產環境中使用,此次版本的更新,不僅提高了工作效率,也提供了 HTTP/2 Client API。

技術分享圖片

同時,這也是自 Oracle 宣布以六個月為周期更新後發布的第一個長期支持版本。下載地址如下:

https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

JDK 11 主要特性

最新發布的 JDK 11 共帶來了 17 項更新:

181:Nest-Based Access Control(基於嵌套的訪問控制)
309:Dynamic Class-File Constants(動態類文件常量)
315: Improve Aarch64 Intrinsics(改進 Aarch64 內部函數)
318:Epsilon: A No-Op Garbage Collector(Epsilon:No-Op 垃圾收集器)
320:Remove the Java EE and CORBA Modules(刪除 Java EE 和 CORBA 模塊)
321:HTTP Client (Standard)(HTTP 客戶端)

323:Local-Variable Syntax for Lambda Parameters(Lambda 參數的變量語法)

技術分享圖片

324:Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法實現的密鑰協議)
327:Unicode 10
328:Flight Recorder(飛行記錄器)
329:ChaCha20 and Poly1305 Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)
330:Launch Single-File Source-Code Programs(啟動單文件源代碼程序)

331:Low-Overhead Heap Profiling(低開銷堆分配采樣方法)
332: Transport Layer Security (TLS) 1.3(TLS 1.3 的傳輸層安全性)
333:ZGC: A Scalable Low-Latency Garbage Collector(Experimental)(ZGC:可擴展的低延遲垃圾收集器,在實驗階段)
335:Deprecate the Nashorn JavaScript Engine(棄用 Rhino JavaScript 引擎)
336:Deprecate the Pack200 Tools and API(棄用 Pack200 工具和 API)

從開發者的角度來看,上面的特性中有幾點需要特別關註。

JEP 323 實現了 Java 10 中引入的局部變量類型推斷的擴展。類型推斷是從其余源代碼和鍵入規則中推導出的數據類型。這節省了開發者的工作時間,且不會使源代碼過於復雜,而提高了可讀性。

從 Java 10 開始,可以使用關鍵字 var 聲明局部變量,如下所示:

// Funktioniert seit Java 10
var zahl = 5; // int
var string = "Hello World"; // String
var objekt = BigDecimal.ONE; // BigDecimal

技術分享圖片

在 Java 11 中,不同點在於開發者可以使用 var 聲明 lambda 參數。乍一看,這一舉措似乎有點多余,因為在寫代碼過程中可以省略 lambda 參數的類型,並通過類型推斷確定它們。但是,擴展名對於使用 @Nonnull 和 @Nullable 等類型註釋很有用。

// Inference von Lambda-Parametern
Consumer<String> printer = (var s) -> System.out.println(s);
// statt s -> System.out.println(s);
// aber keine Mischung von "var" und deklarierten Typen
m?glich
// BiConsumer<String, String> printer = (var s1, String s2)
-> System.out.println(s1 + " " + s2);
// Nützlich für Type Annotations
BiConsumer<String, String> printer = (@Nonnull var s1,
@Nullable var s2)

JDK 11 中另一個亮點在於仍處於實驗階段的新 HTTP Client API 的標準化,該 API 在 JDK 9 中被引入,在 JDK 10 中進行了更新,在本次 JDK 11 中包名由 jdk.incubator.http 改為 java.net.http。HTTP Client API 除了實現了HTTP(1.1和2)、WebSocket,同步和異步調用以及 Reactive Streams 現在也受支持。還使用清晰易懂的 Fluent 界面,將來可能會淘汰其他 HTTP 客戶端(如 Apache)的使用。

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.build();
client.sendAsync(request, asString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();

JEP 330(啟動單文件源代碼程序)現在可以啟動尚未編譯的類。如今單文件程序在編寫小實用程序時很常見,特別是腳本語言領域。從中開發者可以省去用 Java 編譯程序等不必要工作,以及減少新手的入門障礙。在基於 Java 10 的程序中可以通過三種方式啟動:

作為 .class文件
作為
.jar文件中的主類
作為模塊中的主類
現在,Java 11 中可以在源代碼文件中聲明類:

java HelloWorld.java

// statt

javac HelloWorld.java

java -cp . hello.World

在 Unix 操作系統上,Java 文件甚至可以直接作為 Shebang 文件執行:

#!/path/to/java --source version

./HelloWorld.java

技術分享圖片

其他值得註意的變化包括支持 Unicode 10 標準以及將 Profiler Flight Recorder 集成到 OpenJDK 中(之前僅適用於 Oracle JDK)。Flight Recorder 的目標是盡可能高效地記錄應用程序數據,以便在出現問題時分析 Java 應用程序和 JVM。

API 的變化

此外,Java 類庫也有不少小的改動。 特別是字符串:

| Welcome to JShell -- Version 11
| For an introduction type: /help intro
// Unicode zu String
jshell> Character.toString(100)
$1 ==> "d"
jshell> Character.toString(66)
$2 ==> "B"
// Zeichen mit Faktor multiplizieren
jshell> "-".repeat(20)
$3 ==> "--------------------"
// Enth?lt ein Text keine Zeichen (h?chstens Leerzeichen)?
jshell> String msg = "hello"
msg ==> "hello"
jshell> msg.isBlank()
$5 ==> false
jshell> String msg = " "
msg ==> " "
jshell> msg.isBlank()
$7 ==> true
// Abschneiden von führenden oder nachgelagerten Leerzeichen
jshell> " hello world ".strip()
$8 ==> "hello world"
jshell> "hello world ".strip()
$9 ==> "hello world"
jshell> "hello world ".stripTrailing()
$10 ==> "hello world"
jshell> " hello world ".stripLeading()
$11 ==> "hello world "
jshell> " ".strip()
$12 ==> ""
// Texte zeilenweise verarbeiten
jshell> String content = "this is a multiline content
Mostly obtained from some file
which we will break into lines
using the new api"
content ==> "this is a multiline content
Mostly obtained fro ... ines
using the new api"
jshell> content.lines().forEach(System.out::println)
this is a multiline content
Mostly obtained from some file
which we will break into lines
using the new api

技術分享圖片

Java 11 計劃於上月,即 9 月 25 日發布。與 Java 10 不同,Java 11 不僅提供了長期支持,還將作為 Java 平臺的參考實現。新的長期支持版本每三年發布一次,根據後續的發布計劃,Java 17 將於 2021 年發布。

Java 11:刪除了什麽?

Oracle JDK 將不再包含 JavaFX(OpenJDK 從未提供過)。相反,JavaFX 通過 OpenJFX 作為單獨的下載提供,並且可以像任何 Java 應用程序中的任何其他庫一樣使用。除 JavaFX 外,還將停止對 Applet 和 Java Web Start 的支持。如果仍然想使用 Java Web Start,那麽必須保持在 JDK 8 的版本,直至 Oracle 停止免費更新後,花錢購買該服務。

技術分享圖片

另一個在 Java 11 中被棄用的 JavaScript 引擎 Rhino。預計它將在 Java 的未來版本中徹底消失。不過值得註意的是,Rhino 從未真正將自己斷言為 Node.js 上的服務器端 JavaScript 實現基礎。通過 GraalVM,Oracle 現在采用其他方式在 JVM 上本地運行其他編程語言。

順便說一下,從 Java 11 開始,Java 運行時環境(JRE)將僅存在於服務器版本中,而不再存在於桌面中。但是,對於具有模塊系統和 jlink 工具的桌面應用程序,開發者現在可以輕松創建或調整運行時環境。

JDK 11 是否值得更新?

今年四月,Oracle 發布官方聲明表示即將停止對 JDK 8 的正常支持(免費更新):

2019 年 1 月之後,Oracle 將不會在其網站上發布 Java SE 8 商業使用的進一步更新下載。如需持續獲取安全的 Bug 修復和安全補丁以及 Java SE 8 或以前版本的穩定性支持,可以通過 Oracle Java SE 高級版、Oracle Java SE 高級桌面、或 Oracle Java SE 套件。
技術分享圖片

這意味著,在 2019 年 1 月之後,開發者想要使用老版本只能付費了,從中也側面看出,Oracle 在間接性鼓勵用戶主動升級。不過,據各種對 Java 用戶調查如 Jaxenter 發現,大多數的開發者依舊停留在 Java 8 以內的版本。

技術分享圖片

其實,這也不足為怪,當開發者剛開始吐槽新版本帶來的問題時,Java 已搭載上了火箭更新到了下一版本,讓大家措手不及。此前,就連 Java Collection Framework 的創建者 Josh Bloch 都在吐槽 Java 9 模塊系統(Project Jigsaw)帶來令人頭痛的問題,甚至建議:

現在說 Project Jigsaw 將在 JDK 之外實現廣泛使用還為時過早。與此同時,除非你有迫切需要,否則最好避免使用它們。
那麽對於 JDK 11 是否值得立即更新使用?按照 Oracle 公布支持的路線圖來看,如文章開頭所述,Java 11 將會獲得 Oracle 長期的服務支持,直至 2026 年 9 月。相比 Java 9 和 10 這兩個僅提供半年技術支持的版本來說,JDK 11 的發布無疑對個人開發者以及企業都是一件好事。
技術分享圖片

那麽,再結合其新特性,你會選擇更新到 JDK 11 嗎?

Java 11 正式發布!