首頁 Java Java基礎 java14有什麼新特性

java14有什麼新特性

Jun 20, 2020 pm 01:33 PM
特性

java14有什麼新特性

一、Switch表達式

在先前的發布中,switch表達式只是一個「預覽」階段的特性。我想提醒一下,「預覽」階段的特性的目的是為了收集回饋,這些特性可能隨時改變,根據回饋結果,這些特性甚至可能會被移除,但通常所有預覽特性最後都會在Java中固定下來。

(推薦教學:java入門程式

新的switch表達式的優點是,不再有預設跳過行為(fall-through),更全面,而且表達式和組合形式更容易編寫,因此出現bug的可能性就更低。例如,switch表達式現在可以使用箭頭語法,如下所示:

var log = switch (event) {
case PLAY -> "User has triggered the play button";
case STOP, PAUSE -> "User needs a break";
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield "Unknown event " + message +
" logged on " + now;
}
};
登入後複製

二、文字區塊

Java 13引入的一個預覽功能是文字區塊。有了文字區塊,多行的字串字面量就很容易編寫了。這個功能在Java 14中進行第二次預覽,而且發生了一些變化。例如,多行文字的格式化可能需要編寫許多字串連接操作和轉義序列。下面的程式碼示範了一個HTML的範例:

String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";
登入後複製

有了文字區塊,就可以簡化這個過程,只需使用三引號作為文字區塊的起始和結束標記,就能寫出更優雅的程式碼:

String html = """
<HTML>
<BODY>
<H1>"Java 14 is here!"</H1>
</BODY>
</HTML>""";
登入後複製

與普通的字串字面量相比,文字區塊的表達性更好。

Java 14引進了兩個新的轉義序列。第一,可以使用新的 \s 轉義序列來表示一個空格。第二,可以使用反斜線 \ 來避免在行尾插入換行字元。這樣可以很容易地在文字區塊中將一個很長的行分解成多行來增加可讀性。

例如,現在寫多行字串的方式如下:

String literal =
"Lorem ipsum dolor sit amet, consectetur adipiscing " +
"elit, sed do eiusmod tempor incididunt ut labore " +
"et dolore magna aliqua.";
登入後複製

在文字區塊中使用\ 轉義序列,就可以寫成這樣:

String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";
登入後複製

(影片教學推薦:java影片教學

三、instanceof的模式匹配

Java 14引進了預覽特性,有了它就不再需要寫先透過instanceof判斷再強制轉換的程式碼了。例如,下面的程式碼:

if (obj instanceof Group) {
Group group = (Group) obj;
// use group specific methods
var entries = group.getEntries();
}
登入後複製

利用這個預覽特性可以重構為:

if (obj instanceof Group group) {
var entries = group.getEntries();
}
登入後複製

由於條件檢查要求obj為Group類型,為什麼還要像第一段程式碼一樣在條件碼在區塊中指明obj為Group型呢?這可能會引發錯誤。

這種更簡潔的語法可以去掉Java程式裡的大多數強制型別轉換。

JEP 305解釋了這個改變,並給出了Joshuoa Bloch的著作《Effective Java》中的一個例子,演示了下面兩種等價的寫法:

@Override public boolean equals(Object o) {
return (o instanceof CaseInsensitiveString) &&
((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}
登入後複製

這段程式碼嗎中冗餘的CaseInsensitiveString強制類型轉換可以去掉,轉換成下面的方式:

@Override public boolean equals(Object o) {
return (o instanceof CaseInsensitiveString cis) &&
cis.s.equalsIgnoreCase(s);
}
登入後複製

這個預覽特性很值得嘗試,因為它打開了通往更通用的模式匹配的大門。模式匹配的想法是為語言提供一個便捷的語法,根據特定的條件從物件中提取組成部分。這正是instanceof操作符的用例,因為條件就是類型檢查,提取操作需要呼叫適當的方法,或存取特定的欄位。

換句話說,該預覽功能只是個開始,以後該功能肯定能夠減少更多的程式碼冗餘,從而降低bug發生的可能性。

四、Record

另一個預覽功能就是record。與前面介紹的其他預覽功能一樣,這個預覽功能也順應了減少Java冗餘程式碼的趨勢,並能幫助開發者寫出更精準的程式碼。 Record主要用於特定領域的類,它的位移功能就是儲存數據,而沒有任何自訂的行為。

我們開門見山,舉一個最簡單的領域類別的例子:BankTransaction,它表示一次交易,包含三個欄位:日期,金額,以及描述。定義類別的時候需要考慮多個面向:

建構器getter方法toString()hashCode()和equals()這些部分的程式碼通常由IDE自動生成,而且會佔用很大篇幅。以下是產生的完整的BankTransaction類別:

public class BankTransaction {private final LocalDate date;
private final double amount;
private final String description;
public BankTransaction(final LocalDate date,
final double amount,
final String description) {
this.date = date;
this.amount = amount;
this.description = description;
}
public LocalDate date() {
return date;
}
public double amount() {
return amount;
}
public String description() {
return description;
}
@Override
public String toString() {
return "BankTransaction{" +
"date=" + date +
", amount=" + amount +
", description=&#39;" + description + &#39;\&#39;&#39; +
&#39;}&#39;;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BankTransaction that = (BankTransaction) o;
return Double.compare(that.amount, amount) == 0 &&
date.equals(that.date) &&
description.equals(that.description);
}
@Override
public int hashCode() {
return Objects.hash(date, amount, description);
}
}
登入後複製

Java 14提供了一種方法可以解決這種冗餘,可以更清晰地表達目的:這個類別的唯一目的就是將資料整合在一起。 Record會提供equals、hashCode和toString方法的實作。因此,BankTransaction類別可以重構如下:

public record BankTransaction(LocalDate date,double amount,
String description) {}
登入後複製

透過record,可以「自動」地得到equals,hashCode和toString的實現,還有建構器和getter方法。

想嘗試這個例子,需要用preview標誌編譯該檔案:

javac --enable-preview --release 14 BankTransaction.javarecord的欄位隱含為final。因此,record的欄位不能被重新賦值。但要注意的是,這並不代表整個record是不可變的,保存在欄位中的物件可以是可變的。

五、NullPointerException

#

一些人认为,抛出NullPointerException异常应该当做新的“Hello World”程序来看待,因为NullPointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码:

var name = user.getLocation().getCity().getName();
登入後複製

在Java 14之前,你可能会得到如下的错误:

Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)
登入後複製

不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回null。实际上,变量user也可能是null。因此,无法判断是谁导致了NullPointerException。

在Java 14中,新的JVM特性可以显示更详细的诊断信息:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is nullat NullPointerExample.main(NullPointerExample.java:5)
登入後複製

该消息包含两个明确的组成部分:

后果:Location.getCity()无法被调用原因:User.getLocation()的返回值为null增强版本的诊断信息只有在使用下述标志运行Java时才有效:

-XX:+ShowCodeDetailsInExceptionMessages
登入後複製

下面是个例子:

java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample
登入後複製

在以后的版本中,该选项可能会成为默认。

这项改进不仅对于方法调用有效,其他可能会导致NullPointerException的地方也有效,包括字段访问、数组访问、赋值等。

以上是java14有什麼新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

win7家庭版與win7旗艦版的差異介紹 win7家庭版與win7旗艦版的差異介紹 Jul 12, 2023 pm 08:41 PM

大家都知道win7系統有很多種版本,像是win7旗艦版、win7專業版、win7家用版等,有不少用戶在家庭版和旗艦版之間糾結,不知道選擇哪個版本比較好,所以今天小編來跟大家說說win7家庭餐與win7旗艦版的差別介紹,大家一起來看看。 1.體驗不同家庭普通版使您的日常操作變得更快、更簡單,可以更快、更方便地存取使用最頻繁的程式和文件。家庭高級版讓您享有最佳的娛樂體驗,可以輕鬆欣賞和分享您喜愛的電視節目、照片、影片和音樂。旗艦版集各版本功能大全,具備Windows7家庭高級版的所有娛樂功能與專

掌握Spring MVC的關鍵概念:了解這些重要特性 掌握Spring MVC的關鍵概念:了解這些重要特性 Dec 29, 2023 am 09:14 AM

了解SpringMVC的關鍵特性:掌握這些重要的概念,需要具體程式碼範例SpringMVC是一種基於Java的Web應用開發框架,它透過模型-視圖-控制器(MVC)的架構模式來幫助開發人員建立靈活可擴展的Web應用程式。了解和掌握SpringMVC的關鍵特性將使我們能夠更有效地開發和管理我們的網路應用程式。本文將介紹一些SpringMVC的重要概念

Golang中有類似類別的物件導向特性嗎? Golang中有類似類別的物件導向特性嗎? Mar 19, 2024 pm 02:51 PM

在Golang(Go語言)中並沒有傳統意義上的類別的概念,但它提供了一種稱為結構體的資料類型,透過結構體可以實現類似類別的物件導向特性。在本文中,我們將介紹如何使用結構體實現物件導向的特性,並提供具體的程式碼範例。結構體的定義和使用首先,讓我們來看看結構體的定義和使用方式。在Golang中,結構體可以透過type關鍵字定義,然後在需要的地方使用。結構體中可以包含屬

選擇適用的Go版本,依需求和特性 選擇適用的Go版本,依需求和特性 Jan 20, 2024 am 09:28 AM

隨著網路的快速發展,程式語言也不斷演化和更新。其中,Go語言作為一種開源的程式語言,在近年來備受關注。 Go語言的設計目標是簡單、有效率、安全且易於開發和部署。它具有高並發、快速編譯和記憶體安全等特性,讓它在Web開發、雲端運算和大數據等領域中有著廣泛的運用。然而,目前Go語言也有不同的版本可供選擇。在選擇合適的Go語言版本時,我們需要考慮需求和特性兩個面向。首

5g的三個特性是什麼 5g的三個特性是什麼 Dec 09, 2020 am 10:55 AM

5g的三個特性是:1、高速率;在實際應用中,5G網路的速率是4G網路10倍以上。 2、低時延;5G網路的時延約幾十毫秒,比人的反應速度還要快。 3.廣連結;5G網路出現,配合其他技術,將會打造一個全新的萬物互聯景象。

C++ 函式的型別和特性 C++ 函式的型別和特性 Apr 11, 2024 pm 03:30 PM

C++函式有以下型別:簡單函式、const函式、靜態函式、虛函式;特性包括:inline函式、預設參數、參考回傳、重載函式。例如,calculateArea函數使用π計算給定半徑圓的面積,並將其作為輸出傳回。

java的特性是什麼 java的特性是什麼 Aug 09, 2023 pm 03:05 PM

java的特性是:1、簡單易學;2、面向對象,使得程式碼更可重複使用和維護;3、平台無關性,能在不同的作業系統上運作;4、記憶體管理,透過自動垃圾回收機制來管理記憶體;5、強型別檢查,變數在使用前必須先聲明類型;6、安全性,可以防止未經授權的存取和惡意程式碼的執行;7、多執行緒支持,能提高程式的效能和回應能力;8、異常處理,可以避免程式崩潰;9、大量的開發庫和框架;10、開源生態系統。

提升程式碼效率的五大PHP8亮點功能! 提升程式碼效率的五大PHP8亮點功能! Jan 13, 2024 am 08:19 AM

PHP8的五大亮點功能,讓你的程式碼更有效率! PHP(HypertextPreprocessor)是一種廣泛使用的開源腳本語言,用於Web開發。它簡單易學,可以與HTML嵌套使用,同時也支援物件導向程式設計。 PHP8作為最新版本,具有許多令人興奮的新功能和改進,以下是五個主要亮點功能,可以讓你的程式碼更有效率。一、JIT編譯器(Just-In-TimeCompile

See all articles