java9
近幾年來JDK更新飛快,目前最近的更新JDK是ORACLE於2019年9月16日更新的JDK13。並且ORACLE計劃於2020年3月發佈的JDK14。不得不說,更新速度太快了,一個版本的特性還沒有摸熟,新的就已經推出了。當然了,我們在企業開發中,JDK的版本當然不會隨着ORACLE的更新而更新,而是根據自身的需要來選擇合適的版本。
目前國內大多數公司使用的JDK版本都是JDK1.8。但是可以預見的是,在幾年之後,也會有很多公司去選擇使用JDK9、JDK10等等。作爲開發人員,必須清楚的瞭解到JDK都更新了哪些內容,以便我們更好的完成開發工作。(雖然現在ORACLE推薦直接跳過JDK9,直接更新到JDK10.)
Java 9 包含了豐富的特性集。雖然Java 9沒有新的語言概念,但是有開發者感興趣的新的API和診斷命令。
- 模塊系統
Java 9中主要的變化是已經實現的模塊化系統。
模塊就是代碼和數據的封裝體。模塊的代碼被組織成多個包,每個包中包含Java類和接口;模塊的數據則包括資源文件和其他靜態信息。
Java 9 模塊的重要特徵是在其工件(artifact)的根目錄中包含了一個描述模塊的 module-info.class 文 件。 工件的格式可以是傳統的 JAR 文件或是 Java 9 新增的 JMOD 文件。這個文件由根目錄中的源代碼文件 module-info.java 編譯而來。該模塊聲明文件可以描述模塊的不同特徵。
在 module-info.java 文件中,我們可以用新的關鍵詞module來聲明一個模塊,如下所示。下面給出了一個模塊com.mycompany.mymodule的最基本的模塊聲明。
module com.runoob.mymodule {
}
創建模塊
接下來我們創建一個 com.runoob.greetings 的模塊。
第一步
創建文件夾 C:>JAVA\src,然後在該目錄下再創建與模塊名相同的文件夾 com.runoob.greetings。
第二步
在 C:>JAVA\src\com.runoob.greetings 目錄下創建 module-info.java 文件,代碼如下:
module com.runoob.greetings { }
module-info.java 用於創建模塊。這一步我們創建了 com.runoob.greetings 模塊。
第三步
在模塊中添加源代碼文件,在目錄 C:>JAVA\src\com.runoob.greetings\com\runoob\greetings 中創建文件 Java9Tester.java,代碼如下:
package com.runoob.greetings;
public class Java9Tester {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
第四步
創建文件夾 C:>JAVA\mods,然後在該目錄下創建 com.runoob.greetings 文件夾,編譯模塊到這個目錄下:
C:/>JAVA> javac -d mods/com.runoob.greetings
src/com.runoob.greetings/module-info.java
src/com.runoob.greetings/com/runoob/greetings/Java9Tester.java
第五步
執行模塊,查看輸出結果:
C:/>JAVA> java --module-path mods -m com.runoob.greetings/com.runoob.greetings.Java9Tester
Hello World!
module-path 指定了模塊所在的路徑。
-m 指定主要模塊。
- JShell
用過Python的同學都知道,Python 中的讀取-求值-打印循環( Read-Evaluation-Print Loop )很方便。它的目的在於以即時結果和反饋的形式。
java9引入了jshell這個交互性工具,讓Java也可以像腳本語言一樣來運行,可以從控制檯啓動 jshell ,在 jshell 中直接輸入表達式並查看其執行結果。當需要測試一個方法的運行效果,或是快速的對表達式進行求值時,jshell 都非常實用。
除了表達式之外,還可以創建 Java 類和方法。jshell 也有基本的代碼完成功能。我們在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。
怎麼理解,怎麼用呢?這個只是針對於java9來說,相當於cmd工具,你可以和cmd一樣,直接寫方法等等,不過我認爲只是適用於初學者做一些最簡單的運算和寫一些方法:
在cmd中打開這個工具:
進入工具後可以做一些簡單的java操作
這個功能對初學者還是挺友好的。
- 集合工廠方法
Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工廠方法來創建不可變集合。
先看一下在JDK1.8中的簡單示例:
List <Point> myList = new ArrayList <>();
myList.add(new Point(1,1));
myList.add(new Point(2,2));
myList.add(new Point(3,3));
myList.add(new Point(4,4));
myList = Collections.unmodifiableList(myList);
在java 8中,要創建一個包含四個Points不可變列表需要6行代碼。java 9通過工廠的集合方法解決了這個問題。
在java 9中:
List<Point> list =
List.of(new Point(1, 1), new Point(2, 2),
new Point(3, 3), new Point(4, 4));
- 私有接口方法
在java 8中爲接口提供了靜態方法和默認方法。所以接口中可以定義常量、抽象方法、靜態方法和默認方法。而在java 9中,有增加了私有方法。
public interface Test {
// java 7
int num = 1;
void doThing();
// java 8
static String addString(String s){
return s + "1";
}
String printString();
// java 9
private void print(String s){
System.out.println(s);
}
}
默認方法和靜態方法可以共享接口中的私有方法,因此避免了代碼冗餘,這也使代碼更加清晰。如果私有方法是靜態的,那這個方法就屬於這個接口的。並且沒有靜態的私有方法只能被在接口中的實例調用。
- 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 resp = client.send(req, HttpResponse.BodyHandler.asString());
除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送。
- HTML5風格的Java幫助文檔
Java 8之前的版本生成的Java幫助文檔是在HTML 4中。在Java 9中,Javadoc 的輸出現在符合兼容 HTML5 標準。現在HTML 4是默認的輸出標記語言,但是在之後發佈的JDK中,HTML 5將會是默認的輸出標記語言。
Java幫助文檔還是由三個框架組成的結構構成,這是不會變的,並且以HTML 5輸出的Java幫助文檔也保持相同的結構。每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息。
- 多版本兼容 jar 包
多版本兼容 JAR 功能能讓你創建僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本。
通過 --release 參數指定編譯版本。
具體的變化就是 META-INF 目錄下 MANIFEST.MF 文件新增了一個屬性:
Multi-Release: true
然後 META-INF 目錄下還新增了一個 versions 目錄,如果是要支持 java9,則在 versions 目錄下有 9 的目錄。
multirelease.jar
├── META-INF
│ └── versions
│ └── 9
│ └── multirelease
│ └── Helper.class
├── multirelease
├── Helper.class
└── Main.class
- 改進的 Stream API
長期以來,Stream API 都是 Java 標準庫最好的改進之一。在 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();
上述幾個特性當然不是java 9特性的全部,這裏只是簡單介紹幾個常用的。其他的特性就需要大家在平時開發過程中學習和使用了。