java14的新特性有哪些

java14的新特性有哪些?針對(duì)這個(gè)問(wèn)題,這篇文章給出了相對(duì)應(yīng)的分析和解答,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。

成都創(chuàng)新互聯(lián)專(zhuān)注于撫順縣企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,電子商務(wù)商城網(wǎng)站建設(shè)。撫順縣網(wǎng)站建設(shè)公司,為撫順縣等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

一、Switch表達(dá)式

在之前的發(fā)布中,switch表達(dá)式只是一個(gè)“預(yù)覽”階段的特性。我想提醒一下,“預(yù)覽”階段的特性的目的是為了收集反饋,這些特性可能會(huì)隨時(shí)改變,根據(jù)反饋結(jié)果,這些特性甚至可能會(huì)被移除,但通常所有預(yù)覽特性最后都會(huì)在Java中固定下來(lái)。

三、instanceof的模式匹配

Java 14引入了一個(gè)預(yù)覽特性,有了它就不再需要編寫(xiě)先通過(guò)instanceof判斷再?gòu)?qiáng)制轉(zhuǎn)換的代碼了。例如,下面的代碼:

if (obj instanceof Group) {
Group group = (Group) obj;
// use group specific methods
var entries = group.getEntries();
}

利用這個(gè)預(yù)覽特性可以重構(gòu)為:

if (obj instanceof Group group) {
var entries = group.getEntries();
}

由于條件檢查要求obj為Group類(lèi)型,為什么還要像第一段代碼那樣在條件代碼塊中指明obj為Group類(lèi)型呢?這可能會(huì)引發(fā)錯(cuò)誤。

這種更簡(jiǎn)潔的語(yǔ)法可以去掉Java程序里的大多數(shù)強(qiáng)制類(lèi)型轉(zhuǎn)換。

JEP 305解釋了這項(xiàng)改變,并給出了Joshuoa Bloch的著作《Effective Java》中的一個(gè)例子,演示了下面兩種等價(jià)的寫(xiě)法:

@Override public boolean equals(Object o) {
return (o instanceof CaseInsensitiveString) &&
((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}

這段代碼嗎中冗余的CaseInsensitiveString強(qiáng)制類(lèi)型轉(zhuǎn)換可以去掉,轉(zhuǎn)換成下面的方式:

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

這個(gè)預(yù)覽特性很值得嘗試,因?yàn)樗蜷_(kāi)了通向更通用的模式匹配的大門(mén)。模式匹配的思想是為語(yǔ)言提供一個(gè)便捷的語(yǔ)法,根據(jù)特定的條件從對(duì)象中提取出組成部分。這正是instanceof操作符的用例,因?yàn)闂l件就是類(lèi)型檢查,提取操作需要調(diào)用適當(dāng)?shù)姆椒?,或訪(fǎng)問(wèn)特定的字段。

換句話(huà)說(shuō),該預(yù)覽功能僅僅是個(gè)開(kāi)始,以后該功能肯定能夠減少更多的代碼冗余,從而降低bug發(fā)生的可能性。

四、Record

另一個(gè)預(yù)覽功能就是record。與前面介紹的其他預(yù)覽功能一樣,這個(gè)預(yù)覽功能也順應(yīng)了減少Java冗余代碼的趨勢(shì),能幫助開(kāi)發(fā)者寫(xiě)出更精準(zhǔn)的代碼。Record主要用于特定領(lǐng)域的類(lèi),它的位移功能就是存儲(chǔ)數(shù)據(jù),而沒(méi)有任何自定義的行為。

我們開(kāi)門(mén)見(jiàn)山,舉一個(gè)最簡(jiǎn)單的領(lǐng)域類(lèi)的例子:BankTransaction,它表示一次交易,包含三個(gè)字段:日期,金額,以及描述。定義類(lèi)的時(shí)候需要考慮多個(gè)方面:

構(gòu)造器getter方法toString()hashCode()和equals()這些部分的代碼通常由IDE自動(dòng)生成,而且會(huì)占用很大篇幅。下面是生成的完整的BankTransaction類(lèi):

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='" + description + '\'' +
'}';
}
@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提供了一種方法可以解決這種冗余,可以更清晰地表達(dá)目的:這個(gè)類(lèi)的唯一目的就是將數(shù)據(jù)整合在一起。Record會(huì)提供equals、hashCode和toString方法的實(shí)現(xiàn)。因此,BankTransaction類(lèi)可以重構(gòu)如下:

public record BankTransaction(LocalDate date,double amount,
String description) {}

通過(guò)record,可以“自動(dòng)”地得到equals,hashCode和toString的實(shí)現(xiàn),還有構(gòu)造器和getter方法。

要想嘗試這個(gè)例子,需要用preview標(biāo)志編譯該文件:

javac --enable-preview --release 14 BankTransaction.javarecord的字段隱含為final。因此,record的字段不能被重新賦值。但要注意的是,這并不代表整個(gè)record是不可變的,保存在字段中的對(duì)象可以是可變的。

五、NullPointerException

一些人認(rèn)為,拋出NullPointerException異常應(yīng)該當(dāng)做新的“Hello World”程序來(lái)看待,因?yàn)镹ullPointerException是早晚會(huì)遇到的。玩笑歸玩笑,這個(gè)異常的確會(huì)造成困擾,因?yàn)樗?jīng)常出現(xiàn)在生產(chǎn)環(huán)境的日志中,會(huì)導(dǎo)致調(diào)試非常困難,因?yàn)樗⒉粫?huì)顯示原始的代碼。例如,如下代碼:

var name = user.getLocation().getCity().getName();

在Java 14之前,你可能會(huì)得到如下的錯(cuò)誤:

Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)

不幸的是,如果在第5行是一個(gè)包含了多個(gè)方法調(diào)用的賦值語(yǔ)句(如getLocation()和getCity()),那么任何一個(gè)都可能會(huì)返回null。實(shí)際上,變量user也可能是null。因此,無(wú)法判斷是誰(shuí)導(dǎo)致了NullPointerException。

在Java 14中,新的JVM特性可以顯示更詳細(xì)的診斷信息:

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)

該消息包含兩個(gè)明確的組成部分:

后果:Location.getCity()無(wú)法被調(diào)用原因:User.getLocation()的返回值為null增強(qiáng)版本的診斷信息只有在使用下述標(biāo)志運(yùn)行Java時(shí)才有效:

-XX:+ShowCodeDetailsInExceptionMessages

下面是個(gè)例子:

java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample

在以后的版本中,該選項(xiàng)可能會(huì)成為默認(rèn)。

這項(xiàng)改進(jìn)不僅對(duì)于方法調(diào)用有效,其他可能會(huì)導(dǎo)致NullPointerException的地方也有效,包括字段訪(fǎng)問(wèn)、數(shù)組訪(fǎng)問(wèn)、賦值等。

關(guān)于java14的新特性就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁(yè)名稱(chēng):java14的新特性有哪些
當(dāng)前地址:http://muchs.cn/article2/ipgooc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、動(dòng)態(tài)網(wǎng)站網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)