Java 11 正式發布!

Java 11 正式發佈!

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

Java 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
Java 11 正式發佈!

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 printer = (var s) -> System.out.println(s); // statt s -> System.out.println(s);
// aber keine Mischung von "var" und deklarierten Typen möglich
// BiConsumer
printer = (var s1, String s2) -> System.out.println(s1 + " " + s2);
// Nützlich für Type Annotations
BiConsumer printer = (@Nonnull var s1, @Nullable var s2) -> System.out.println(s1 + (s2 == null ? "" : " " + 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\nMostly obtained from some file\rwhich we will break into lines\r\nusing the new api"
content ==> "this is a multiline content\nMostly obtained fro ... ines\r\nusing 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 工具的桌面應用程序,開發者現在可以輕鬆創建或調整運行時環境。

Java 11 正式發佈!

JDK 11 是否值得更新?

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

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

Java 11 正式發佈!

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

Java 11 正式發佈!

其實,這也不足為怪,當開發者剛開始吐槽新版本帶來的問題時,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 的發佈無疑對個人開發者以及企業都是一件好事。

Java 11 正式發佈!

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

參考:

https://jaxenter.de/java-11-features-news-75411

  • 用 Python 分析《鬥破蒼穹》,分析其究竟是爛片無疑還是滄海遺珠?
  • 程序員最喜歡什麼樣的項目經理?
  • 因公開破解酒店 WiFi,騰訊 23 歲程序員遭到逮捕!
  • Linux 之父道歉了,卻被程序員威脅撤銷貢獻代碼!

徵稿啦

CSDN 公眾號秉持著「與千萬技術人共成長」理念,不僅以「極客頭條」、「暢言」欄目在第一時間以技術人的獨特視角描述技術人關心的行業焦點事件,更有「技術頭條」專欄,深度解讀行業內的熱門技術與場景應用,讓所有的開發者緊跟技術潮流,保持警醒的技術嗅覺,對行業趨勢、技術有更為全面的認知。

如果你有優質的文章,或是行業熱點事件、技術趨勢的真知灼見,或是深度的應用實踐、場景方案等的新見解,歡迎聯繫 CSDN 投稿,

聯繫方式:微信(guorui_1118,請備註投稿+姓名+公司職位),郵箱([email protected])。


分享到:


相關文章: