Java 9的14個新特性總結
作者 | Aboullaite Mohammed
翻譯 |Kenneth
Java 9 包含了豐富的特性集。雖然Java 9沒有新的語言概念,但是有開發者感興趣的新的API和診斷命令。
我們將快速的,著重的瀏覽其中的幾個新特性:
模塊化系統–Jigsaw 項目
模塊化是一個很通用的概念。在軟體中,模塊化可以運用到編寫和實現一個程序和計算系統,他們都是作為獨立的模塊,而不是作為一個單一的和完整的設計。
Java 9中主要的變化是已經實現的模塊化系統。模塊化的引入使得JDK可以在更小的設備中使用。採用模塊化系統的應用程序只需要這些應用程序所需的那部分JDK模塊,而非是整個JDK框架了。模塊化系統也可以將公共的類封裝到一個模塊中。因此一個封裝在模塊中的定義為public的類不能再任何地方使用,除非一個模塊顯式的定義了這個模塊。由於Java 9的這個變化,Java內部的API(例如com.sun.*)默認情況下是不能使用的。
簡而言之,所有的模塊將需要在所謂的module-info.java文件中進行描述,這個文件是位於Java代碼結構的頂層。
我們的模塊car(汽車)需要依賴+模塊engine(引擎)和需要導出handling(操縱)包。
需要更多深入的例子可以查看OpenJDK中項目Jigsaw:模塊化系統快速入門(http://openjdk.java.net/projects/jigsaw/quick-start)。
JShell–Java 9 REPL
你可能問:「REPL是什麼」?REPL是一種快速運行語句的命令行工具。
在Java中,如果你想執行一個簡單的語句,我們要麼創建一個帶main方法的類,要麼創建一個可以執行的Test類。當你正在啟動Java程序的時候,如果你想執行某些語句並且想立刻看見執行結果,上面的做法看起來不是那麼有用了。
JShell試圖去解決這個問題。Java開發者可以利用JShell在沒有創建類的情況下直接聲明變數,計算表達式,執行語句。JShell也可以從文件中載入語句或者將語句保存到文件中。並且JShell也可以是tab鍵進行自動補全的特性。
集合工廠方法
在Java 9之前,Java只能利用一些實用方法(例如:Collections.unmodifiableCollection(Collection
現在,Java 9引入了一些有用的工廠方法來創建不可修改的集合。我們現在在Java 9中創建不可修改的Map集合,如下所示。
下面是工廠方法的例子:
介面中的私有方法
Java 8的介面引入了默認方法和靜態方法。雖然Java 8首次計劃實現介面的私有方法,卻是在Java 9中實現。默認方法和靜態方法可以共享介面中的私有方法,因此避免了代碼冗餘,這也使代碼更加清晰。如果私有方法是靜態的,那這個方法就屬於這個介面的。並且沒有靜態的私有方法只能被在介面中的實例調用。
響應式流
JDK9中的Flow API對應響應式流規範,響應式流規範是一種事實標準。JEP 266包含了一組最小介面集合,這組介面能捕獲核心的非同步發布與訂閱。希望在未來第三方能夠實現這些介面,並且能共享其方式。
* Flow.Processor(處理器)
* Flow.Publisher(發布者)
* Flow.Subscriber(訂閱者)
* Flow.Subscription(訂閱管理器)
這些介面都支持響應式流發布-訂閱框架。Java 9也提供了實用類SubmissionPublisher。一個發布者產生一個或多個物品,這些物品由一個或多個消費者消耗。並且訂閱者由訂閱管理器管理。訂閱管理器連接發布者和訂閱者。
多解析度圖像API–JEP 251
目標是定義多解析度圖像API,這樣開發者就能很容易的操作和展示不同解析度的圖像了。
* 將不同解析度的圖像封裝到一張(多解析度的)圖像中,作為它的變體。
* 獲取這個圖像的所有變體。
* 獲取特定解析度的圖像變體–表示一張已知解析度單位為DPI的特定尺寸大小的邏輯圖像,並且這張圖像是最佳的變體。
進程API的改進
迄今為止,通過Java來控制和管理操作系統的進程的能力有限。例如,為了做一些簡單的事情,像獲取進程的PID,你要麼需要訪問本地代碼,要麼使用某種臨時解決方案。不僅如此,每個(系統)平台需要一個不同實現來確保你能獲得正確的結果。
在Java 9中,期望代碼能獲取Linux PID,現在是如下方式:
你可以變換如下的方式(同樣支持所有的操作系統):
Try-With-Resources
在Java 7中,try-with-resouces語法要求為每一個資源聲明一個新的變數,而且這些資源由try-with-resources語句進行管理。
在就Java 9中,有另外一個改進:如果一個資源被final或者等效於final變數引用,則在不需要聲明一個新的變數的情況下,try-with-resources就可以管理這個資源。
鑽石(diamond)操作符範圍的延伸
Java 7給出的鑽石操作符使我們編寫代碼更簡單了。在下面的例子中,你可以看見Java 7中List(列表)的可讀性更強了,並且使代碼更加的簡潔了。
但是Java 7中鑽石操作符不允許在匿名類上使用。但在Java 9中改善了這一情況,允許鑽石操作符在匿名類上使用。下面的例子只有在Java 9中才能通過編譯。
增強的注釋Deprecated
注釋@Deprecated可以標記Java API。注釋@Deprecated有很多種含義,例如它可以表示在不遠的將來的某個時間,被標記的API將會被移除。它也可以表示這個API已經被破壞了,並不應該再被使用。它還有其它很多含義。為了提供更多有關@Deprecated的信息,@Deprecated添加了forRemoval元素和since元素。
Java SE 9 中也提供了掃描jar文件的工具jdeprscan。這款工具也可以掃描一個聚合類,這個類使用了Java SE中的已廢棄的API元素。 這個工具將會對使用已經編譯好的庫的應用程序有幫助,這樣使用者就不知道這個已經編譯好的庫中使用了那些已廢棄的API。
統一的JVM日誌
如今,我們很難知道導致JVM性能問題和導致JVM崩潰的根本原因。解決這個問題的一個方法是對所有的JVM組件引入一個單一的系統,這些JVM組件支持細粒度的和易配置的JVM日誌。目前,不同的JVM組件對於日誌使用的是不同的機制和規則,這使得JVM難以進行調試。
注釋SafeVarargs範圍的延伸
直到Java 8,@SafeVarargs才能在靜態方法、final方法和構造器上使用。但是這些方法或者構造器是不能被覆蓋的。這些方法中缺少另一個不能被覆蓋的方法,這個方法就是私有方法。Java 9可以將@SafeVarargs添加到私有方法上。下面的例子在Java 9中是正確的,但是在Java 8中就會拋出編譯時錯誤: 注釋@SafeVarargs不能在非final的實例方法iAmSafeVaragrsMethod上使用。
HTTP 2 客戶端
Java 9採用了全新的HTTP客戶端API,這些API支持HTTP/2協議和WebSocket協議,並且替換了遺留的HTTPURLConnectionAPI。這些改變並不應該在Java 9中完成。這些API可以從Incubator(孵化器)模塊中獲取。因此在默認情況下,這個模塊是不能根據classpath獲取的,需要使用--add-modules命令選項配置這個模塊,將這個模塊添加到classpath中。
我們創建一個HTTPRequest請求和獲取非同步的響應:
HTML5風格的Java幫助文檔
Java 8以及之前的版本生成的Java幫助文檔是在HTML 4中,而HTML 4已經是很久的標準了。在Java 9中,javadoc命令行中選項部分添加了輸出選項,這個選項的值要麼是HTML 4,要麼是HTML 5。現在HTML 4是默認的輸出標記語言,但是在之後發布的JDK中,HTML 5將會是默認的輸出標記語言。Java幫助文檔還是由三個框架組成的結構構成,這是不會變的,並且以HTML 5輸出的Java幫助文檔也保持相同的結構。
更多的特性
* 保留下劃線字元。變數不能被命名為_;
* 廢棄Applet API;
* javac不再支持Java1.4以及之前的版本;
* 廢棄Java瀏覽器插件;
* 棧遍歷API–棧遍歷API能過濾和遲訪問在堆棧跟蹤中的信息。
更多資源:http://openjdk.java.net/projects/jdk9/


※基於OpenGL ES的深度學習框架編寫
※CCTC 2017開幕倒計時,講師+議程全公布
※5月TIOBE排行榜:Java和C語言正在被超越
※市值250億的特徵向量——谷歌背後的線性代數
TAG:CSDN |