天天看點

java 9 的新特性解讀(1)

java 9 的新特性解讀(1)

前言

 經過4次跳票,曆經曲折的Java 9 終于終于在2017年9月21日釋出。

 從Java 9 這個版本開始,Java 的計劃釋出周期是 6 個月,下一個 Java 的主版本将于 2018 年 3 月釋出,命名為 Java 18.3,緊接着再過六個月将釋出 Java18.9。

 這意味着Java的更新從傳統的以特性驅動的釋出周期,轉變為以時間驅動的 (6 個月為周期)釋出模式,并逐漸的将 Oracle JDK 原商業特性進行開源。

 針對企業客戶的需求,Oracle 将以三年為周期釋出長期支援版本(longtermsupport)。

 Java 9 提供了超過150項新功能特性,包括備受期待的子產品化系統、可互動 的 REPL 工具:jshell,JDK 編譯工具,Java 公共 API 和私有代碼,以及安全增強、擴充提升、性能管理改善等。可以說Java 9是一個龐大的系統工程,完全做了一個整體改變。

新特效一覽 

 子產品化系統

 jShell指令

 多版本相容jar包

 接口的私有方法

 鑽石操作符的使用更新

 文法改進:try語句

 String存儲結構變更

 便利的集合特性:of()

 增強的Stream API

 全新的HTTP用戶端API

 Deprecated的相關API

 javadoc的HTML 5支援

 Javascript引擎更新:Nashorn

 java的動态編譯器

JDK 和 JRE 目錄結構的改變  

java 9 的新特性解讀(1)
java 9 的新特性解讀(1)
java 9 的新特性解讀(1)
java 9 的新特性解讀(1)

子產品化系統: Jigsaw =>Modularity  

談到 Java 9 大家往往第一個想到的就是 Jigsaw 項目。衆所周知,Java 已經 發展超過 20 年(95 年最初釋出),Java 和相關生态在不斷豐富的同時也越 來越暴露出一些問題:

 Java 運作環境的膨脹和臃腫。每次JVM啟動的時候,至少會有30~60MB的記憶體 加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第 一步整個jar都會被JVM加載到記憶體當中去(而子產品化可以根據子產品的需要加載程 序運作需要的class)
 當代碼庫越來越大,建立複雜,盤根錯節的“意大利面條式代碼”的幾率呈指數級的增長。不同版本的類庫交叉依賴導緻讓人頭疼的問題,這些都阻礙了 Java 開發和運作效率的提升。
 很難真正地對代碼進行封裝, 而系統并沒有對不同部分(也就是 JAR 檔案)之間 的依賴關系有個明确的概念。每一個公共類都可以被類路徑之下任何其它的公共類所通路到,這樣就會導緻無意中使用了并不想被公開通路的 API。
 本質上講也就是說,用子產品來管理各個package,通過聲明某個package暴露,子產品(module)的概念,其實就是package外再裹一層,不聲明預設就是隐藏。是以,子產品化使得代碼組織上更安全,因為它可以指定哪 些部分可以暴露,哪些部分隐藏。

 實作目标

 子產品化的主要目的在于減少記憶體的開銷

 隻須必要子產品,而非全部jdk子產品,可簡化各種類庫和大型應用的開 發和維護

 改進 Java SE 平台,使其可以适應不同大小的計算裝置

 改進其安全性,可維護性,提高性能

 子產品将由通常的類和新的子產品聲明檔案(module-info.java)組成。該檔案是位于java代碼結構的頂層,該子產品描述符明确地定義了我們的子產品需要什麼依賴關系, 以及哪些子產品被外部使用。在exports子句中未提及的所有包預設情況下将封裝在 子產品中,不能在外部使用。

java 9 的新特性解讀(1)

要想在java9demo子產品中調用java9test子產品下包中的結構,需要在java9test的module-info.java中聲明:

module java9test {

//package we export

    exports com.atguigui.bean;
}
           

exports:控制着哪些包可以被其它子產品通路到。所有不被導出的包預設 都被封裝在子產品裡面。 

對應在java 9demo 子產品的src 下建立module-info.java檔案: 

module java9demo {

    requires java9test;

}
           

requires:指明對其它子產品的依賴。 

 子產品化的主要目的在于減少記憶體的開銷

 隻須必要子產品,而非全部jdk子產品,可簡化各種類庫和大型應用的開 發和維護

 改進 Java SE 平台,使其可以适應不同大小的計算裝置

 改進其安全性,可維護性,提高性能

 子產品化的主要目的在于減少記憶體的開銷

 隻須必要子產品,而非全部jdk子產品,可簡化各種類庫和大型應用的開 發和維護

 改進 Java SE 平台,使其可以适應不同大小的計算裝置

 改進其安全性,可維護性,提高性能