天天看點

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)

Java 14 已經釋出有一周時間了,我準備來開個箱,和小夥伴們一起來看看新特性裡面都有哪些好玩的。我們程式員應該抱着嘗鮮、獵奇的心态,否則就容易固步自封,技術停滞不前。先來看看 Java 14 都有哪些新特性吧!

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)
紅色線劃出來的是我比較感興趣的,其餘的對我沒什麼太大的吸引力,就暫且略過。

01、下載下傳 JDK 14

要想開箱,得先下載下傳 JDK 14,不然拿什麼開箱呢,對吧?有 2 處地方可供下載下傳,Oracle 上可以下載下傳商用版, jdk.java.net 上可以下載下傳開源版。我們就選擇後者吧。

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)

我目前用的是 Windows 作業系統,是以就選擇 Windows 版的 zip 包進行下載下傳,完成後記得解壓。

02、更新 IntelliJ IDEA

需要把 IDEA 更新到搶先體驗版 2020.1 EAP,否則無法支援 Java 14 的新特性。

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)

社群版的下載下傳位址如下所示:

[https://www.jetbrains.com/idea/nextversion/#section=windows](https://www.jetbrains.com/idea/nextversion/#section=windows)

安裝的時候可以把之前的版本解除安裝,也可以選擇保留。完成後,我們來建立一個 Java 14 的項目。

01、instanceof

按照新特性的順序,我們就先從 instanceof 說起吧。舊式的 instanceof 的用法如下所示:
public class OldInstanceOf {
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        if (str instanceof String) {
            String s = (String)str;
            System.out.println(s.length());
        }
    }
}      

需要先使用 instanceof 在 if 條件中判斷 str 的類型是否為 String(第一步),再在 if 語句中将 str 強轉為字元串類型(第二步),并且要重新聲明一個變量用于強轉後的指派(第三步)。

三個步驟也不算多,但總覺得應該還有更好的文法,這不,Java 14 就想到了這一層。

public class NewInstanceOf {
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        if (str instanceof String s) {
            System.out.println(s.length());
        }
    }
}      

可以直接在 if 條件判斷類型的時候添加一個變量,就不需要再強轉和聲明新的變量了。是不是特别簡潔?但模式比對的 instanceof 在 Java 14 中是預覽版的,預設是不啟用的,是以這段代碼會有一個奇怪的編譯錯誤(Java 14 中不支援模式比對的 instanceof)。

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)

那怎麼解決這個問題呢?需要在項目配置中手動設定一下語言的版本。

你打算用Java 8一輩子都不打算更新到Java 14,真香(1)

設定完成後,編譯錯誤就随風飄走了。程式輸出的結果如下所示:

10

不錯不錯,真香。想知道 Java 編譯器在背後幫我們做了什麼嗎?看一下反編譯後的位元組碼就明白了。

public class NewInstanceOf {
    public NewInstanceOf() {
    }
    public static void main(String[] args) {
        Object str = "Java 14,真香";
        String s;
        if (str instanceof String && (s = (String)str) == (String)str) {
            System.out.println(s.length());
        }
    }
}      

在 if 條件判斷前,先聲明了變量 s,然後在 if 條件中進行了強轉 s = (String)str),并且判斷了 s 和 str 是否相等。确實是一個解放開放者生産力的好特性,強烈希望這個特性在下個版本中轉正。