2020/3/17日JDK14正式發版,生產環境用不用再說,趕緊下載下來體驗一番。不過據說該版本並不是長期版本,但即使再發布新版本也是在此基礎上的。
另外,想體驗Java14還是需要一些准備工作的,除了安裝jdk,還需要安裝支持java14的idea,比如2020.1版本。當然,如果整個團隊都使用該版本,則需要同時升級IDE,否則低版本的IDE無法正確識別。
java14新特性
在JDK14中新增了以下16個新特性:
- 305: instanceof的模式匹配 (預覽)
- 343: 打包工具 (Incubator)
- 345: G1的NUMA內存分配優化
- 349: JFR事件流
- 352: 非原子性的字節緩沖區映射
- 358: 友好的空指針異常
- 359: Records (預覽)
- 361: Switch表達式 (標准)
- 362: 棄用Solaris和SPARC端口
- 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
- 364: macOS系統上的ZGC
- 365: Windows系統上的ZGC
- 366: 棄用ParallelScavenge + SerialOld GC組合
- 367: 移除Pack200 Tools和API
- 368: 文本塊 (第二個預覽版)
- 370: 外部存儲器API (Incubator)
通過上述新特性,我們可以看出其中363、364、365、366都是關於垃圾回收器的。其中363已經明確棄用CMS垃圾收集器。
而其中針對開發過程中可見的特性包括:instanceof模式匹配、Switch表達式、文本塊等。下面我們就來體驗一下編程過程中能用到語法形式。
instanceof模式匹配
通常情況下我們使用instanceof來探測類的真實類型,如果符合該類型,則可進行強制轉換。
在Java14之前,我們通常的寫法如下:
Object obj = "程序新視界";
if(obj instanceof String){
String str = (String) obj;
System.out.println("關注公眾號:" + str);
}
通過java14的新特性,我們可以簡化成如下方式:
Object obj = "程序新視界";
if(obj instanceof String str){
System.out.println("關注公眾號:" + str);
}
我們可以通過模式匹配簡潔地表達對象,並允許各種語句和表達式對其進行測試。
Switch表達式
通常情況下我們通過如下形式使用switch語法:
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
java14引入了新形式的switch標簽“case L->”,表示如果匹配,則只執行標簽右邊的代碼。switch標簽允許在每種情況下使用逗號分隔多個常量。
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
是不是簡單清晰了很多。
記錄類型(Record Type)的引入
Java 14中記錄類型(Record Type)作為預覽特性被引入。記錄對象允許使用緊湊的語法來聲明類,和枚舉類型一樣,記錄也是類的一種受限形式。
在idea 2020.1中,創建Record與創建類和枚舉一樣,可以在創建時直接選擇對應的類型。
定義一個Record類型如下:
public record Point(int x, int y) {
}
使用Record操作如下:
Point point = new Point(1,3);
System.out.println(point.x());
System.out.println(point.y());
對Record類進行反編譯我們會看到如下內容:
public final class Point extends java.lang.Record {
private final int x;
private final int y;
public Point(int x, int y) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int x() { /* compiled code */ }
public int y() { /* compiled code */ }
}
是不是有替代Lombok的潛質?
文本塊作為預覽特性保留
通常情況下我們定義一個字符串,如果比較長可使用如下形式進行編寫:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
使用java14的文本塊新特性,則可改寫為如下形式:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
文本塊是Java語言的新語法,可以用來表示任何字符串,具有更高的表達能力和更少的復雜度。
文本塊的開頭定界符是由三個雙引號字符(""")組成的序列,后面跟0個或多個空格,最后跟一個行終止符。內容從開頭定界符的行終止符之后的第一個字符開始。
結束定界符是三個雙引號字符的序列。內容在結束定界符的第一個雙引號之前的最后一個字符處結束。
與字符串文字中的字符不同,文本塊的內容中可以直接包含雙引號字符。允許在文本塊中使用",但不是必需的或不建議使用。
與字符串文字中的字符不同,內容可以直接包含行終止符。允許在文本塊中使用\n,但不是必需或不建議使用。
打包工具 (Incubator)
jpackage打包工具可以將Java應用程序打包為針對特定平台的安裝包,這個安裝包包含所有必需的依賴項。該應用程序可以以普通JAR文件集合或模塊集合的方式提供。軟件包格式可以分為:
- Linux:deb和rpm
- macOS:pkg和dmg
- Windows:msi和exe
小結
當然,java14還有許多其他特性的優化,比如垃圾回收器的ParallelScavenge + SerialOld的棄用等。但在使用之前,還是需要慎重,畢竟很多特性都只是作為預覽特性出現。
補充
如果你也想嘗試java14的新特性,下載idea最新版本之后,注意要依次修改如下配置: