Java 9 中的 9 個新特性

 

Java 8 發佈三年多之後,java9已經發布了 。 你可能已經聽說過 Java 9 的模塊系統,但是這個新版本還有許多其它的更新。 這裏有九個令人興奮的新功能將與 Java 9 一起發佈。

 

1. Java 平臺級模塊系統

Java 9 的定義功能是一套全新的模塊系統。當代碼庫越來越大,創建複雜,盤根錯節的“意大利麪條式代碼”的機率呈指數級的增長。這時候就得面對兩個基礎的問題: 很難真正地對代碼進行封裝, 而系統並沒有對不同部分(也就是 JAR 文件)之間的依賴關係有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到, 這樣就會導致無意中使用了並不想被公開訪問的 API。此外,類路徑本身也存在問題: 你怎麼知曉所有需要的 JAR 都已經有了, 或者是不是會有重複的項呢? 模塊系統把這倆個問題都給解決了。

模塊化的 JAR 文件都包含一個額外的模塊描述器。在這個模塊描述器中, 對其它模塊的依賴是通過 “requires”  來表示的。另外, exports” 語句控制着哪些包是可以被其它模塊訪問到的。所有不被導出的包默認都封裝在模塊的裏面。如下是一個模塊描述器的示例,存在於 “module-info.java” 文件中:

module blog {
  exports com.pluralsight.blog;

  requires cms;
}
LeoXu
LeoXu
翻譯於 7個月前
1人頂
 翻譯得不錯哦!
 

我們可以如下展示模塊:

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

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

無若
無若
翻譯於 7個月前
1人頂
 翻譯得不錯哦!
 

2. Linking

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

Tocy
Tocy
翻譯於 7個月前
1人頂
 翻譯得不錯哦!
 

3. JShell: 交互式 Java REPL

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

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

總長
總長
翻譯於 7個月前
0人頂
 翻譯得不錯哦!
 

4. 改進的 Javadoc

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

Tocy
Tocy
翻譯於 7個月前
0人頂
 翻譯得不錯哦!
 

5. 集合工廠方法

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

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

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

總長
總長
翻譯於 7個月前
0人頂
 翻譯得不錯哦!
 

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 對象:

Stream<Integer> s = Optional.of(1).stream();

在組合複雜的 Stream 管道時,將 Optional 轉換爲 Stream 非常有用。

邊城
邊城
翻譯於 7個月前
2人頂
 翻譯得不錯哦!
 
其它翻譯版本(1)

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 ,那麼私有接口方法可能有助於構建其實現。

總長
總長
翻譯於 7個月前
0人頂
 翻譯得不錯哦!
 

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());

 

除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章