Java14發佈,16大新特性,代碼更加簡潔明快

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最新版本之後,注意要依次修改如下配置:

image

image

image
原文鏈接:《Java14發佈,16大新特性,代碼更加簡潔明快

《Spring Boot 2.x 視頻教程全家桶》,精品Spring Boot 2.x視頻教程,打造一套最全的Spring Boot 2.x視頻教程。


程序新視界

公衆號“程序新視界”,一個讓你軟實力、硬技術同步提升的平臺

csdn-微信公衆號

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