有多少語言在提刀想反超 Java的路上?但萬萬沒想到,人家并未當回事,如今這款常青藤甚至越跑越歡,當我們還在使用 Java 7/8 時,它已經(jīng)一路跑到了 11。
和預(yù)期的時間差不多,北京時間 9 月 26 日,Oracle 官方宣布 Java 11(18.9 LTS) 正式發(fā)布,可供生產(chǎn)環(huán)境中使用,此次版本的更新,不僅提高了工作效率,也提供了HTTP/2ClientAPI。
同時,這也是自 Oracle 宣布以六個月為周期更新后發(fā)布的第一個長期支持版本。下載地址如下:
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
JDK 11 主要特性
最新發(fā)布的 JDK 11 共帶來了 17 項更新:
181:Nest-Based Access Control(基于嵌套的訪問控制)
309:Dynamic Class-File Constants(動態(tài)類文件常量)
315:Improve Aarch64 Intrinsics(改進 Aarch64 內(nèi)部函數(shù))
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 參數(shù)的變量語法)
324:Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法實現(xiàn)的密鑰協(xié)議)
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)
從開發(fā)者的角度來看,上面的特性中有幾點需要特別關(guān)注。
一
JEP 323 實現(xiàn)了 Java 10 中引入的局部變量類型推斷的擴展。類型推斷是從其余源代碼和鍵入規(guī)則中推導(dǎo)出的數(shù)據(jù)類型。這節(jié)省了開發(fā)者的工作時間,且不會使源代碼過于復(fù)雜,而提高了可讀性。
從 Java 10 開始,可以使用關(guān)鍵字 var 聲明局部變量,如下所示:
//FunktioniertseitJava10varzahl=5;//intvarstring="HelloWorld";//Stringvarobjekt=BigDecimal.ONE;//BigDecimal
在 Java 11 中,不同點在于開發(fā)者可以使用 var 聲明 lambda 參數(shù)。乍一看,這一舉措似乎有點多余,因為在寫代碼過程中可以省略 lambda 參數(shù)的類型,并通過類型推斷確定它們。但是,擴展名對于使用 @Nonnull 和 @Nullable 等類型注釋很有用。
//InferencevonLambda-ParameternConsumer
二
JDK 11 中另一個亮點在于仍處于實驗階段的新 HTTP Client API 的標準化,該 API 在 JDK 9 中被引入,在 JDK 10 中進行了更新,在本次 JDK 11 中包名由 jdk.incubator.http 改為 java.net.http。HTTP Client API 除了實現(xiàn)了HTTP(1.1和2)、WebSocket,同步和異步調(diào)用以及 Reactive Streams 現(xiàn)在也受支持。還使用清晰易懂的 Fluent 界面,將來可能會淘汰其他 HTTP 客戶端(如 Apache)的使用。
HttpClientclient=HttpClient.newHttpClient();HttpRequestrequest=HttpRequest.newBuilder().uri(URI.create("http://openjdk.java.net/")).build();client.sendAsync(request,asString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join();
三
JEP 330(啟動單文件源代碼程序)現(xiàn)在可以啟動尚未編譯的類。如今單文件程序在編寫小實用程序時很常見,特別是腳本語言領(lǐng)域。從中開發(fā)者可以省去用 Java 編譯程序等不必要工作,以及減少新手的入門障礙。在基于 Java 10 的程序中可以通過三種方式啟動:
作為* .class文件
作為* .jar文件中的主類
作為模塊中的主類
現(xiàn)在,Java 11 中可以在源代碼文件中聲明類:
#javaHelloWorld.java//statt#javacHelloWorld.java#java-cp.hello.World
在 Unix 操作系統(tǒng)上,Java 文件甚至可以直接作為 Shebang 文件執(zhí)行:
#!/path/to/java--sourceversion
#./HelloWorld.java
其他值得注意的變化包括支持 Unicode 10 標準以及將 Profiler Flight Recorder 集成到 OpenJDK 中(之前僅適用于 Oracle JDK)。Flight Recorder 的目標是盡可能高效地記錄應(yīng)用程序數(shù)據(jù),以便在出現(xiàn)問題時分析 Java 應(yīng)用程序和 JVM。
API 的變化
此外,Java 類庫也有不少小的改動。 特別是字符串:
|WelcometoJShell--Version11|Foranintroductiontype:/helpintro//UnicodezuStringjshell>Character.toString(100)$1==>"d"jshell>Character.toString(66)$2==>"B"http://ZeichenmitFaktormultiplizierenjshell>"-".repeat(20)$3==>"--------------------"http://Enth?lteinTextkeineZeichen(h?chstensLeerzeichen)?jshell>Stringmsg="hello"msg==>"hello"jshell>msg.isBlank()$5==>falsejshell>Stringmsg=""msg==>""jshell>msg.isBlank()$7==>true//AbschneidenvonführendenodernachgelagertenLeerzeichenjshell>"helloworld".strip()$8==>"helloworld"jshell>"helloworld".strip()$9==>"helloworld"jshell>"helloworld".stripTrailing()$10==>"helloworld"jshell>"helloworld".stripLeading()$11==>"helloworld"jshell>"".strip()$12==>""http://Textezeilenweiseverarbeitenjshell>Stringcontent="thisisamultilinecontent Mostlyobtainedfromsomefile whichwewillbreakintolines usingthenewapi"content==>"thisisamultilinecontent Mostlyobtainedfro...ines usingthenewapi"jshell>content.lines().forEach(System.out::println)thisisamultilinecontentMostlyobtainedfromsomefilewhichwewillbreakintolinesusingthenewapi
Java 11 計劃于本月,即 9 月 25 日發(fā)布。與 Java 10 不同,Java 11 不僅提供了長期支持,還將作為 Java 平臺的參考實現(xiàn)。新的長期支持版本每三年發(fā)布一次,根據(jù)后續(xù)的發(fā)布計劃,Java 17 將于 2021 年發(fā)布。
Java 11:刪除了什么?
Oracle JDK 將不再包含 JavaFX(OpenJDK 從未提供過)。相反,JavaFX 通過 OpenJFX 作為單獨的下載提供,并且可以像任何 Java 應(yīng)用程序中的任何其他庫一樣使用。除 JavaFX 外,還將停止對 Applet 和 Java Web Start 的支持。如果仍然想使用 Java Web Start,那么必須保持在 JDK 8 的版本,直至 Oracle 停止免費更新后,花錢購買該服務(wù)。
另一個在 Java 11 中被棄用的 JavaScript 引擎 Rhino。預(yù)計它將在 Java 的未來版本中徹底消失。不過值得注意的是,Rhino 從未真正將自己斷言為 Node.js 上的服務(wù)器端 JavaScript 實現(xiàn)基礎(chǔ)。通過 GraalVM,Oracle 現(xiàn)在采用其他方式在 JVM 上本地運行其他編程語言。
順便說一下,從 Java 11 開始,Java 運行時環(huán)境(JRE)將僅存在于服務(wù)器版本中,而不再存在于桌面中。但是,對于具有模塊系統(tǒng)和 jlink 工具的桌面應(yīng)用程序,開發(fā)者現(xiàn)在可以輕松創(chuàng)建或調(diào)整運行時環(huán)境。
JDK 11 是否值得更新?
今年四月,Oracle 發(fā)布官方聲明表示即將停止對 JDK 8 的正常支持(免費更新):
2019 年 1 月之后,Oracle 將不會在其網(wǎng)站上發(fā)布 Java SE 8 商業(yè)使用的進一步更新下載。如需持續(xù)獲取安全的 Bug 修復(fù)和安全補丁以及 Java SE 8 或以前版本的穩(wěn)定性支持,可以通過 Oracle Java SE 高級版、Oracle Java SE 高級桌面、或 Oracle Java SE 套件。
這意味著,在 2019 年 1 月之后,開發(fā)者想要使用老版本只能付費了,從中也側(cè)面看出,Oracle 在間接性鼓勵用戶主動升級。不過,據(jù)各種對 Java 用戶調(diào)查如 Jaxenter發(fā)現(xiàn),大多數(shù)的開發(fā)者依舊停留在 Java 8 以內(nèi)的版本。
其實,這也不足為怪,當開發(fā)者剛開始吐槽新版本帶來的問題時,Java 已搭載上了火箭更新到了下一版本,讓大家措手不及。此前,就連Java Collection Framework 的創(chuàng)建者 Josh Bloch 都在吐槽Java 9 模塊系統(tǒng)(Project Jigsaw)帶來令人頭痛的問題,甚至建議:
現(xiàn)在說Project Jigsaw將在 JDK 之外實現(xiàn)廣泛使用還為時過早。與此同時,除非你有迫切需要,否則最好避免使用它們。
那么對于 JDK 11 是否值得立即更新使用?按照 Oracle 公布支持的路線圖來看,如文章開頭所述,Java 11 將會獲得 Oracle 長期的服務(wù)支持,直至 2026 年 9 月。相比 Java 9 和 10 這兩個僅提供半年技術(shù)支持的版本來說,JDK 11 的發(fā)布無疑對個人開發(fā)者以及企業(yè)都是一件好事。
那么,再結(jié)合其新特性,你會選擇更新到 JDK 11 嗎?
-
JAVA
+關(guān)注
關(guān)注
19文章
2952瀏覽量
104489 -
Oracle
+關(guān)注
關(guān)注
2文章
286瀏覽量
35086
原文標題:Java 11 正式發(fā)布!
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論