Java9新特性

來源:互聯網
上載者:User

標籤:目標   tools.jar   handle   特性   bbb   包括   相容   null   俱樂部   

Java9前幾天已經發布了,在此羅列下它的主要特性

1.Java模組系統

  JDK9的核心變化就是引入了一種新的Java編程組件,也就是模組。按照Oracle的說法,它是一個可命名的、自描述的代碼和資料集合。模組技術的核心目標是減少Java應用和Java核心運行時環境的大小與複雜性。為此,JDK本身進行了模組化,Oracle希望通過這種方式提升效能、安全性和可維護性。

   為了支援Java 9的模組,引入一種新的模組化JAR檔案形式,按照這種形式會在其根目錄中包含一個module-info.class檔案。Oracle同時提供了工具,允許我們組合和最佳化一組模組,形成自訂的運行時鏡像(image),這樣的鏡像不必將整個Java運行時包含進來(模組化處理)。模組化所帶來的其他變化包括從Java運行時鏡像中移除了rt.jar和tools.jar

  模組化的 JAR 檔案都包含一個額外的模組描述器。在這個模組描述器中, 對其它模組的依賴是通過 “requires” 來表示的。另外, “exports” 語句控制著哪些包是可以被其它模組訪問到的。所有不被匯出的包預設都封裝在模組的裡面。如下是一個模組描述器的樣本,存在於 “module-info.java” 檔案中:

1 module blog {2   exports com.pluralsight.blog;3  4   requires cms;5 }

我們可以如下展示模組:

請注意,兩個模組都包含封裝的包,因為它們沒有被匯出(使用橙色盾牌可視化)。 沒有人會偶然地使用來自這些包中的類。Java 平台本身也使用自己的模組系統進行了模組化。通過封裝 JDK 的內部類,平台更安全,持續改進也更容易。

當啟動一個模組化應用時, JVM 會驗證是否所有的模組都能使用,這基於 `requires` 語句——比脆弱的類路徑邁進了一大步。模組允許你更好地強制結構化封裝你的應用並明確依賴。你可以在這個課程中學習更多關於 Java 9 中模組工作的資訊

2.Link

當你使用具有顯式依賴關係的模組和模組化的 JDK 時,新的可能性出現了。你的應用程式模組現在將聲明其對其他應用程式模組的依賴以及對其所使用的 JDK 模組的依賴。為什麼不使用這些資訊建立一個最小的運行時環境,其中只包含運行應用程式所需的那些模組呢? 這可以通過 Java 9 中的新的 jlink 工具實現。你可以建立針對應用程式進行最佳化的最小運行時映像而不需要使用完全載入 JDK 安裝版本

3.JShell : 互動式 Java REPL

許多語言已經具有互動式編程環境,Java 現在加入了這個俱樂部。您可以從控制台啟動 jshell ,並直接啟動輸入和執行 Java 代碼。 jshell 的即時反饋使它成為探索 API 和嘗試語言特性的好工具。

測試一個 Java Regex是一個很好的說明 jshell 如何使您的生活更輕鬆的例子。 互動式 shell 還可以提供良好的教學環境以及提高生產力,您可以在此瞭解更多資訊。在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話

這個命令列環境為Java平台帶來了讀入-求值-列印-迴圈(Read-Eval-Print-Loop,REPL)功能。它的目的在於以即時結果和反饋的形式,簡化原型的實現並協助我們探索語言在編碼時的可選項

4. 改進的 Javadoc

有時一些小事情可以帶來很大的不同。你是否就像我一樣在一直使用 Google 來尋找正確的 Javadoc 頁面呢? 這不再需要了。Javadoc 現在支援在 API 文檔中的進行搜尋。另外,Javadoc 的輸出現在符合相容 HTML5 標準。此外,你會注意到,每個 Javadoc 頁面都包含有關 JDK 模組類或介面來源的資訊。

5. 集合Factory 方法

通常,您希望在代碼中建立一個集合(例如,List 或 Set ),並直接用一些元素填充它。 執行個體化集合,幾個 “add” 調用,使得代碼重複。 Java 9,添加了幾種集合Factory 方法:

Set<Integer> ints = Set.of(1, 2, 3);List<String> strings = List.of("first", "second");
 

除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。 事實上,從Factory 方法返回已放入數個元素的集合實現是高度最佳化的。這是可能的,因為它們是不可變的:在建立後,繼續添加元素到這些集合會導致 “UnsupportedOperationException”

6. 改進的 Stream API

長期以來,Stream API 都是 Java 標準庫最好的改進之一。通過這套 API 可以在集合上建立用於轉換的申明管道。在 Java 9 中它會變得更好。Stream 介面中添加了 4 個新的方法:dropWhile, takeWhile, ofNullable。還有個 iterate 方法的新重載方法,可以讓你提供一個 Predicate (判斷條件)來指定什麼時候結束迭代:

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

第二個參數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。因此這個簡單的樣本是向控制台列印 1 到 99。

除了對 Stream 本身的擴充,Optional 和 Stream 之間的結合也得到了改進。現在可以通過 Optional 的新方法 `stram` 將一個 Optional 對象轉換為一個(可能是空的) Stream 對象:

7.私人介面方法

Java 8 為我們帶來了介面的預設方法。 介面現在也可以包含行為,而不僅僅是方法簽名。 但是,如果在介面上有幾個預設方法,代碼幾乎相同,會發生什麼情況? 通常,您將重構這些方法,調用一個可複用的私人方法。 但預設方法不能是私人的。 將複用代碼建立為一個預設方法不是一個解決方案,因為該輔助方法會成為公用API的一部分。 使用 Java 9,您可以向介面添加私人輔助方法來解決此問題:

public interface MyInterface {     void normalInterfaceMethod();     default void interfaceMethodWithDefault() {  init(); }     default void anotherDefaultMethod() { init(); }     // This method is not part of the public API exposed by MyInterface    private void init() { System.out.println("Initializing"); }}

如果您使用預設方法開發 API ,那麼私人介面方法可能有助於構建其實現

8.HTTP/2

Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 `HttpURLConnection` API,並提供對 WebSocket 和 HTTP/2 的支援。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模組交付。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

HttpClient client = HttpClient.newHttpClient(); HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.google.com"))              .header("User-Agent","Java")              .GET()              .build();HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送

HTTP/2隻是作為Java 9的一個孵化模組(incubator module)提供的

9. 多版本相容 JAR

我們最後要來著重介紹的這個特性對於庫的維護者而言是個特別好的訊息。當一個新版本的 Java 出現的時候,你的庫使用者要花費數年時間才會切換到這個新的版本。這就意味著庫得去向後相容你想要支援的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)。這實際上意味著未來的很長一段時間,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是,多版本相容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運行庫程式時選擇使用的 class 版本:

multirelease.jar├── META-INF│   └── versions│       └── 9│           └── multirelease│               └── Helper.class├── multirelease    ├── Helper.class    └── Main.class

在上述情境中, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別為 Java 9 準備的 class 版本,可以運用 Java 9 所提供的特性和庫。同時,在早期的 Java 諸版本中使用這個 JAR 也是能啟動並執行,因為較老版本的 Java 只會看到頂層的這個 Helper 類

 

Java9新特性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.