Java 14 令人期待的 5 大新特性,打包工具終於要來了!

  • 1. instanceof 模式匹配
  • 2. 文本塊再次作為預覽特性保留
  • 3. 記錄類型(Record Type)的引入
  • 4. 打包工具終於來了
  • 5. 一個組合垃圾收集器被棄用
  • 6. 結束語

隨著新的 Java 發布生命周期的到來,新版本預計將於 2020 年 3 月發布,本文將對其中的 5 個主要特性作些概述。

Java 13 剛剛發布給開發人員使用不久,最新版本的JDK於2019年9月發布。但是很少有公司現在改用了Java 13 ,因為這個版本看起來無論如何都不會從甲骨文公司獲得長期支持(LTS)。更不要說現在Java 14又已經出現了。

隨著新的Java發布生命周期的到來,新的Java版本預計將於2020年3月發布。時間已經所剩不多了,這就是為什麼甲骨文公司的Java首席架構師Mark Reinhold剛剛提出應該將JDK增強提案(JEP)中的5個主要特性包含進Java 14中的原因。

因此,在這篇文章里我將對這5個主要特性作些概述。這些特性應該作為Java 14的一部分,以便它們可以從2020年3月起提供給開發人員使用。

1. instanceof 模式匹配

作為預覽模式提供的這個新特性旨在通過向用戶提供instanceof操作符的模式匹配來改進Java。

模式匹配在其他語言中已經出現,它使得以一種更安全和更簡潔的方式來表達程序邏輯成為可能。

instanceof操作符的模式匹配將有助於從對象中有條件地提取組件。

在大多數Java程序中,都有下面這種類型的代碼:

if (obj instanceof Integer) {
    int intValue = (Integer) obj;
    // ... use intValue ...
}

在這段代碼中,我們通過instanceof運算符來檢查obj變數是否是Integer的實例。如果條件為真的話,我們不能將obj直接作為一個整數變數使用,因為必須首先對它進行轉換。

上面的代碼不簡潔,也不是很清晰。此外,在程序中重複這種類型的構造會增加出錯的風險。

而作為預覽狀態在Java 14中引入的instanceof操作符的模式匹配將允許對上述代碼作如下簡化:

if (x instanceof Integer i) {
    // ... use i as an Integer directly ...
}

在下面更複雜的例子中,我們可以更加理解Java 14中可以做到什麼:

String formatted = "unknown";if (obj instanceof Integer i) {
    formatted = String.format("int %d", i);
}
else if (obj instanceof Byte b) {
    formatted = String.format("byte %d", b);
}
else if (obj instanceof Long l) {
    formatted = String.format("long %d", l);
}
else if (obj instanceof Double d) {
    formatted = String.format(「double %f", d);
}
else if (obj instanceof String s) {
    formatted = String.format("String %s", s);
}// ... use formatted variable ...

這個例子中最有趣的地方是instanceof模式匹配可以擴展到其他的語法結構中。首先,我們應該可以想到switch表達式。

在未來的Java 15、16或17中,我們可以想象用以下的代碼替換先前的if/else序列是可能的:

String formatted =
    switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Byte b -> String.format("byte %d", b);
        case Long l -> String.format("long %d", l);
        case Double d -> String.format("double %f", d);
        case String s -> String.format("String %s, s);
        default -> String.format("Object %s", obj);
    };// ... use formatted variable

2. 文本塊再次作為預覽特性保留

文本塊(Text Block)在Java 13 中作為預覽特性引入,在Java 14中再次作為預覽特性保留下來。

鑒於在Java 13 發布之後從各大Java社區收集上來的反饋,對文本塊添加了兩個新的轉義序列。

轉義序列符「/」顯式地消除了插入新行字元的需要。以下面這個使用位於小字元串之間的連接運算符「+」來拆分較大字元串的例子為例:

String literal = "This is a string splitted " +
                 "in several smaller " +
                 "strings.";

使用轉義序列符「/」,在Java 14中我們可以像下面這樣來改寫上面的代碼:

String text = """
                This is a string splitted /
                in several smaller /
                strings./
                """;

由於字元文本和傳統字元串文本不允許嵌入換行符,因此轉義序列符「/」僅適用於文本塊。

另一方面,新的轉義序列符「/s」可以被轉換為一個簡單的空白。這樣可以防止空白字元被清除掉。

基於這個轉義序列符,我們可以構建一個字元串,確保每一行的長度相同:

String colors = """
red /s
green/s
blue /s
""";

注意:這個將在Java 14中引入的新轉義序列符(/s)也可以用於傳統的字元串文本。

3. 記錄類型(Record Type)的引入

Java 14中應該可以看到記錄類型(Record Type)作為預覽特性被引入。記錄對象允許使用緊湊的語法來聲明類,而這些類是淺不變數據的透明持有者。

和枚舉類型一樣,記錄也是類的一種受限形式。記錄聲明其表示並提交到與此表示相對應的API。記錄對象放棄了Java類從中受益的自由:也就是將API和其表示分離的能力。作為回報,記錄對象在簡潔性方面提供了顯著的好處。

記錄對象擁有一個名字和一個聲明其組件的狀態描述。記錄對象的主體(body)是可選的。下面是創建一個記錄對象Point的例子:

record Point(int x, int y) { }

這個寫法相當於下面的類聲明:

final class Point {
    public final int x;
    public final int y;


    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }


    // state-based implementations of equals, hashCode, toString
    // nothing else
}

為了在Java 14中引入這種新類型,需要在Java.lang.Class對象中添加如下兩個新方法:

RecordComponent[] getRecordComponents()
boolean isRecord()

這兩個方法的目的是更新Java Reflection API,以便將記錄類型納入其中。

4. 打包工具終於來了

Java 13 發布前的最後一刻被從外圍移除的打包工具jpackage終於可以在Java 14中使用了。但是要注意,它只在Incubator版本中提供。

這個打包工具應該可以讓開發人員創建自主的Java應用程序,它以JavaFX javapackager這個打包工具為基礎。它的主要特點有如下三個:

  • 支持本地打包格式,為用戶提供自然的安裝體驗;
  • 打包時可以指定啟動參數;
  • 通過命令行或使用ToolProvider API的程序來啟動。

5. 一個組合垃圾收集器被棄用

Java 14中令人期待的最新創新顯然不是針對所有Java開發人員的,實際上,它打算棄用ParallelScavenge + SerialOld垃圾收集器組合。

支持這一改變的JEP 366清楚地表明,他們的目的不是要刪除掉這個組合,而是要棄用它。

棄用這種演算法組合的原因是:它很少被使用,同時需要大量的維護工作。

6. 結束語

預定於2020年3月發布的Java 14,對Java開發人員的日常工作影響相對較小。最前沿的新特性是instanceof的模式匹配,這是大多數開發人員都渴望嘗試的新特性。

但是,在生產環境中使用此特性之前,你必須要有耐心,因為它們在Java 14中僅僅作為預覽特性出現。

好消息是,instanceof的模式匹配代表了在Java 15、16或17中進行更廣泛的模式匹配的第一步。

所有這些改變都讓開發人員感到非常高興,因為他們所有人將在程序的可讀性和個人的開發效率方面獲得顯著的收益。title: Java 14 令人期待的 5 大新特性,打包工具終於要來了!date: 2020-03-10
tags:
categories: 精進
permalink: Fight/
author: CSDN 翻譯,譯者:蘇本如
from_url: medium.com/better-programming/top-5-new-features-expected-in-java-14-82c0d85b295e
wechat_url:


隨著新的 Java 發布生命周期的到來,新版本預計將於 2020 年 3 月發布,本文將對其中的 5 個主要特性作些概述。

Java 13 剛剛發布給開發人員使用不久,最新版本的JDK於2019年9月發布。但是很少有公司現在改用了Java 13 ,因為這個版本看起來無論如何都不會從甲骨文公司獲得長期支持(LTS)。更不要說現在Java 14又已經出現了。

隨著新的Java發布生命周期的到來,新的Java版本預計將於2020年3月發布。時間已經所剩不多了,這就是為什麼甲骨文公司的Java首席架構師Mark Reinhold剛剛提出應該將JDK增強提案(JEP)中的5個主要特性包含進Java 14中的原因。

因此,在這篇文章里我將對這5個主要特性作些概述。這些特性應該作為Java 14的一部分,以便它們可以從2020年3月起提供給開發人員使用。

1. instanceof 模式匹配

作為預覽模式提供的這個新特性旨在通過向用戶提供instanceof操作符的模式匹配來改進Java。

模式匹配在其他語言中已經出現,它使得以一種更安全和更簡潔的方式來表達程序邏輯成為可能。

instanceof操作符的模式匹配將有助於從對象中有條件地提取組件。

在大多數Java程序中,都有下面這種類型的代碼:

if (obj instanceof Integer) {
    int intValue = (Integer) obj;
    // ... use intValue ...
}

在這段代碼中,我們通過instanceof運算符來檢查obj變數是否是Integer的實例。如果條件為真的話,我們不能將obj直接作為一個整數變數使用,因為必須首先對它進行轉換。

上面的代碼不簡潔,也不是很清晰。此外,在程序中重複這種類型的構造會增加出錯的風險。

而作為預覽狀態在Java 14中引入的instanceof操作符的模式匹配將允許對上述代碼作如下簡化:

if (x instanceof Integer i) {
    // ... use i as an Integer directly ...
}

在下面更複雜的例子中,我們可以更加理解Java 14中可以做到什麼:

String formatted = "unknown";if (obj instanceof Integer i) {
    formatted = String.format("int %d", i);
}
else if (obj instanceof Byte b) {
    formatted = String.format("byte %d", b);
}
else if (obj instanceof Long l) {
    formatted = String.format("long %d", l);
}
else if (obj instanceof Double d) {
    formatted = String.format(「double %f", d);
}
else if (obj instanceof String s) {
    formatted = String.format("String %s", s);
}// ... use formatted variable ...

這個例子中最有趣的地方是instanceof模式匹配可以擴展到其他的語法結構中。首先,我們應該可以想到switch表達式。

在未來的Java 15、16或17中,我們可以想象用以下的代碼替換先前的if/else序列是可能的:

String formatted =
    switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Byte b -> String.format("byte %d", b);
        case Long l -> String.format("long %d", l);
        case Double d -> String.format("double %f", d);
        case String s -> String.format("String %s, s);
        default -> String.format("Object %s", obj);
    };// ... use formatted variable

2. 文本塊再次作為預覽特性保留

文本塊(Text Block)在Java 13 中作為預覽特性引入,在Java 14中再次作為預覽特性保留下來。

鑒於在Java 13 發布之後從各大Java社區收集上來的反饋,對文本塊添加了兩個新的轉義序列。

轉義序列符「/」顯式地消除了插入新行字元的需要。以下面這個使用位於小字元串之間的連接運算符「+」來拆分較大字元串的例子為例:

String literal = "This is a string splitted " +
                 "in several smaller " +
                 "strings.";

使用轉義序列符「/」,在Java 14中我們可以像下面這樣來改寫上面的代碼:

String text = """
                This is a string splitted /
                in several smaller /
                strings./
                """;

由於字元文本和傳統字元串文本不允許嵌入換行符,因此轉義序列符「/」僅適用於文本塊。

另一方面,新的轉義序列符「/s」可以被轉換為一個簡單的空白。這樣可以防止空白字元被清除掉。

基於這個轉義序列符,我們可以構建一個字元串,確保每一行的長度相同:

String colors = """
red /s
green/s
blue /s
""";

注意:這個將在Java 14中引入的新轉義序列符(/s)也可以用於傳統的字元串文本。

3. 記錄類型(Record Type)的引入

Java 14中應該可以看到記錄類型(Record Type)作為預覽特性被引入。記錄對象允許使用緊湊的語法來聲明類,而這些類是淺不變數據的透明持有者。

和枚舉類型一樣,記錄也是類的一種受限形式。記錄聲明其表示並提交到與此表示相對應的API。記錄對象放棄了Java類從中受益的自由:也就是將API和其表示分離的能力。作為回報,記錄對象在簡潔性方面提供了顯著的好處。

記錄對象擁有一個名字和一個聲明其組件的狀態描述。記錄對象的主體(body)是可選的。下面是創建一個記錄對象Point的例子:

record Point(int x, int y) { }

這個寫法相當於下面的類聲明:

final class Point {
    public final int x;
    public final int y;


    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }


    // state-based implementations of equals, hashCode, toString
    // nothing else
}

為了在Java 14中引入這種新類型,需要在Java.lang.Class對象中添加如下兩個新方法:

RecordComponent[] getRecordComponents()
boolean isRecord()

這兩個方法的目的是更新Java Reflection API,以便將記錄類型納入其中。

4. 打包工具終於來了

Java 13 發布前的最後一刻被從外圍移除的打包工具jpackage終於可以在Java 14中使用了。但是要注意,它只在Incubator版本中提供。

這個打包工具應該可以讓開發人員創建自主的Java應用程序,它以JavaFX javapackager這個打包工具為基礎。它的主要特點有如下三個:

  • 支持本地打包格式,為用戶提供自然的安裝體驗;
  • 打包時可以指定啟動參數;
  • 通過命令行或使用ToolProvider API的程序來啟動。

5. 一個組合垃圾收集器被棄用

Java 14中令人期待的最新創新顯然不是針對所有Java開發人員的,實際上,它打算棄用ParallelScavenge + SerialOld垃圾收集器組合。

支持這一改變的JEP 366清楚地表明,他們的目的不是要刪除掉這個組合,而是要棄用它。

棄用這種演算法組合的原因是:它很少被使用,同時需要大量的維護工作。

6. 結束語

預定於2020年3月發布的Java 14,對Java開發人員的日常工作影響相對較小。最前沿的新特性是instanceof的模式匹配,這是大多數開發人員都渴望嘗試的新特性。

但是,在生產環境中使用此特性之前,你必須要有耐心,因為它們在Java 14中僅僅作為預覽特性出現。

好消息是,instanceof的模式匹配代表了在Java 15、16或17中進行更廣泛的模式匹配的第一步。

所有這些改變都讓開發人員感到非常高興,因為他們所有人將在程序的可讀性和個人的開發效率方面獲得顯著的收益。