Rumah Java JavaAsas java14有什么新特性

java14有什么新特性

Jun 20, 2020 pm 01:33 PM
ciri

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;
}
};
Salin selepas log masuk

二、文本块

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>";
Salin selepas log masuk

有了文本块,就可以简化这一过程,只需使用三引号作为文本块的起始和结束标记,就能编写出更优雅的代码:

String html = """
<HTML>
<BODY>
<H1>"Java 14 is here!"</H1>
</BODY>
</HTML>""";
Salin selepas log masuk

与普通的字符串字面量相比,文本块的表达性更好。

Java 14引入了两个新的转义序列。第一,可以使用新的 \s 转义序列来表示一个空格。第二,可以使用反斜杠 \ 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。

例如,现在编写多行字符串的方式如下:

String literal =
"Lorem ipsum dolor sit amet, consectetur adipiscing " +
"elit, sed do eiusmod tempor incididunt ut labore " +
"et dolore magna aliqua.";
Salin selepas log masuk

在文本块中使用 \ 转义序列,就可以写成这样:

String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";
Salin selepas log masuk

(视频教程推荐:java视频教程

三、instanceof的模式匹配

Java 14引入了一个预览特性,有了它就不再需要编写先通过instanceof判断再强制转换的代码了。例如,下面的代码:

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

利用这个预览特性可以重构为:

if (obj instanceof Group group) {
var entries = group.getEntries();
}
Salin selepas log masuk

由于条件检查要求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);
}
Salin selepas log masuk

这段代码吗中冗余的CaseInsensitiveString强制类型转换可以去掉,转换成下面的方式:

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

这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。这正是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);
}
}
Salin selepas log masuk

Java 14提供了一种方法可以解决这种冗余,可以更清晰地表达目的:这个类的唯一目的就是将数据整合在一起。Record会提供equals、hashCode和toString方法的实现。因此,BankTransaction类可以重构如下:

public record BankTransaction(LocalDate date,double amount,
String description) {}
Salin selepas log masuk

通过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();
Salin selepas log masuk

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

Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)
Salin selepas log masuk

不幸的是,如果在第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)
Salin selepas log masuk

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

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

-XX:+ShowCodeDetailsInExceptionMessages
Salin selepas log masuk

下面是个例子:

java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample
Salin selepas log masuk

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

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

Atas ialah kandungan terperinci java14有什么新特性. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pengenalan kepada perbezaan antara versi win7 home dan versi win7 ultimate Pengenalan kepada perbezaan antara versi win7 home dan versi win7 ultimate Jul 12, 2023 pm 08:41 PM

Semua orang tahu bahawa terdapat banyak versi sistem win7, seperti versi win7 ultimate, versi profesional win7, versi rumah win7, dll. Ramai pengguna terjerat antara versi rumah dan versi muktamad, dan tidak tahu versi mana yang hendak dipilih, jadi hari ini saya akan Izinkan saya memberitahu anda tentang perbezaan antara Win7 Family Meal dan Win7 Ultimate Mari kita lihat. 1. Alami Edisi Asas Rumah Berbeza menjadikan operasi harian anda lebih pantas dan mudah, membolehkan anda mengakses program dan dokumen yang paling kerap anda gunakan dengan lebih pantas dan mudah. Home Premium memberi anda pengalaman hiburan terbaik, menjadikannya mudah untuk menikmati dan berkongsi rancangan TV, foto, video dan muzik kegemaran anda. Edisi Ultimate menyepadukan semua fungsi setiap edisi dan mempunyai semua fungsi hiburan dan ciri profesional Windows 7 Home Premium.

Kuasai konsep utama Spring MVC: Fahami ciri penting ini Kuasai konsep utama Spring MVC: Fahami ciri penting ini Dec 29, 2023 am 09:14 AM

Fahami ciri utama SpringMVC: Untuk menguasai konsep penting ini, contoh kod khusus diperlukan SpringMVC ialah rangka kerja pembangunan aplikasi web berasaskan Java yang membantu pembangun membina struktur yang fleksibel dan berskala melalui corak seni bina Model-View-Controller (MVC). aplikasi web. Memahami dan menguasai ciri utama SpringMVC akan membolehkan kami membangun dan mengurus aplikasi web kami dengan lebih cekap. Artikel ini akan memperkenalkan beberapa konsep penting SpringMVC

Pilih versi Go yang berkenaan, berdasarkan keperluan dan ciri Pilih versi Go yang berkenaan, berdasarkan keperluan dan ciri Jan 20, 2024 am 09:28 AM

Dengan perkembangan pesat Internet, bahasa pengaturcaraan sentiasa berkembang dan dikemas kini. Antaranya, bahasa Go, sebagai bahasa pengaturcaraan sumber terbuka, telah menarik banyak perhatian sejak beberapa tahun kebelakangan ini. Bahasa Go direka untuk menjadi mudah, cekap, selamat dan mudah dibangunkan dan digunakan. Ia mempunyai ciri-ciri konkurensi tinggi, penyusunan pantas dan keselamatan memori, menjadikannya digunakan secara meluas dalam bidang seperti pembangunan web, pengkomputeran awan dan data besar. Walau bagaimanapun, pada masa ini terdapat versi berbeza bahasa Go yang tersedia. Apabila memilih versi bahasa Go yang sesuai, kita perlu mempertimbangkan kedua-dua keperluan dan ciri. kepala

Adakah terdapat ciri berorientasikan objek seperti kelas di Golang? Adakah terdapat ciri berorientasikan objek seperti kelas di Golang? Mar 19, 2024 pm 02:51 PM

Tiada konsep kelas dalam erti kata tradisional dalam Golang (bahasa Go), tetapi ia menyediakan jenis data yang dipanggil struktur, yang melaluinya ciri berorientasikan objek yang serupa dengan kelas boleh dicapai. Dalam artikel ini, kami akan menerangkan cara menggunakan struktur untuk melaksanakan ciri berorientasikan objek dan menyediakan contoh kod konkrit. Definisi dan penggunaan struktur Pertama, mari kita lihat definisi dan penggunaan struktur. Di Golang, struktur boleh ditakrifkan melalui kata kunci jenis dan kemudian digunakan di mana perlu. Struktur boleh mengandungi atribut

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

5g的三个特性是:1、高速率;在实际应用中,5G网络的速率是4G网络10倍以上。2、低时延;5G网络的时延大约几十毫秒,比人的反应速度还要快。3、广连接;5G网络出现,配合其他技术,将会打造一个全新的万物互联景象。

Jenis dan ciri fungsi C++ Jenis dan ciri fungsi C++ Apr 11, 2024 pm 03:30 PM

Fungsi C++ mempunyai jenis berikut: fungsi ringkas, fungsi const, fungsi statik dan fungsi maya termasuk: fungsi sebaris, parameter lalai, pulangan rujukan dan fungsi terlampau beban; Sebagai contoh, fungsi calculateArea menggunakan π untuk mengira luas bulatan jejari tertentu dan mengembalikannya sebagai output.

Apakah ciri-ciri java Apakah ciri-ciri java Aug 09, 2023 pm 03:05 PM

Ciri-ciri Java ialah: 1. Mudah dan mudah dipelajari; 2. Berorientasikan objek, menjadikan kod lebih boleh digunakan semula dan diselenggara 3. Bebas platform, boleh dijalankan pada sistem pengendalian yang berbeza, melalui sampah automatik; mekanisme pengumpulan Menguruskan memori; 5. Pemeriksaan jenis yang kuat, pembolehubah mesti mengisytiharkan jenisnya sebelum digunakan 6. Keselamatan, yang boleh menghalang akses tanpa kebenaran dan pelaksanaan kod berniat jahat; program ; 8. Pengendalian pengecualian boleh mengelakkan ranap program 9. Sebilangan besar perpustakaan dan rangka kerja pembangunan;

Apakah permata Linux? Ketahui lebih lanjut tentang definisi dan ciri Linux Gem Apakah permata Linux? Ketahui lebih lanjut tentang definisi dan ciri Linux Gem Mar 14, 2024 pm 02:18 PM

LinuxGem ialah istilah biasa dalam bidang komputer, yang merujuk kepada perisian atau aplikasi yang berfungsi dengan baik pada sistem pengendalian Linux. Sistem pengendalian Linux itu sendiri ialah sistem pengendalian sumber terbuka dengan sokongan ramai pembangun dan komuniti, jadi mudah untuk mencari perisian berkuasa tinggi yang berkualiti tinggi di Linux. Walau bagaimanapun, walaupun di antara begitu banyak perisian berkualiti tinggi, masih terdapat beberapa perisian yang dipanggil "LinuxGem", yang popular di Linux dengan reka bentuk, prestasi dan fungsi yang sangat baik.

See all articles