Heim > Java > JavaBase > Hauptteil

Was sind die neuen Funktionen von Java14?

王林
Freigeben: 2020-06-20 13:33:43
Original
3273 Leute haben es durchsucht

Was sind die neuen Funktionen von Java14?

1. Ausdruck wechseln

In früheren Versionen war der Ausdruck wechseln nur eine „Vorschau“-Funktion. Ich möchte Sie daran erinnern, dass der Zweck der Funktionen in der „Vorschau“-Phase darin besteht, Feedback zu sammeln. Diese Funktionen können sich jederzeit ändern und basierend auf den Feedback-Ergebnissen können diese Funktionen sogar entfernt werden, in der Regel jedoch alle Vorschaufunktionen wird am Ende in Java behoben.

(Empfohlenes Tutorial: Java Getting Started Program )

Der Vorteil des neuen Schalterausdrucks besteht darin, dass es kein Standard-Überspringverhalten (Fall-Through) mehr gibt. Umfangreicher und Ausdrücke und Kombinationen sind einfacher zu schreiben, sodass Fehler weniger wahrscheinlich auftreten. Beispielsweise können Schalterausdrücke jetzt die Pfeilsyntax verwenden, wie unten gezeigt:

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;
}
};
Nach dem Login kopieren

2. Textblöcke

Eine der in Java 13 eingeführten Vorschaufunktionen sind Textblöcke . Mit Textblöcken lassen sich mehrzeilige String-Literale einfach schreiben. Diese Funktion erhält in Java 14 ihre zweite Vorschau und es gibt einige Änderungen. Beispielsweise kann die Formatierung von mehrzeiligem Text das Schreiben vieler String-Verkettungsoperationen und Escape-Sequenzen erfordern. Der folgende Code zeigt ein HTML-Beispiel:

String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";
Nach dem Login kopieren

Mit Textblöcken kann dieser Vorgang vereinfacht werden. Verwenden Sie einfach dreifache Anführungszeichen als Start- und End-Tags des Textblocks, und Sie können eleganter Code schreiben für:

String html = """
<HTML>
<BODY>
<H1>"Java 14 is here!"</H1>
</BODY>
</HTML>""";
Nach dem Login kopieren

Textblöcke sind aussagekräftiger als normale String-Literale.

Java 14 führt zwei neue Escape-Sequenzen ein. Erstens können Sie die neue Escape-Sequenz verwenden, um ein Leerzeichen darzustellen. Zweitens können Sie einen Backslash verwenden, um das Einfügen eines Zeilenumbruchzeichens am Ende der Zeile zu vermeiden. Dadurch ist es einfacher, eine lange Zeile innerhalb eines Textblocks in mehrere Zeilen aufzuteilen, um die Lesbarkeit zu verbessern.

Zum Beispiel kann man jetzt eine mehrzeilige Zeichenfolge wie folgt schreiben:

String literal =
"Lorem ipsum dolor sit amet, consectetur adipiscing " +
"elit, sed do eiusmod tempor incididunt ut labore " +
"et dolore magna aliqua.";
Nach dem Login kopieren

Unter Verwendung von Escape-Sequenzen in Textblöcken kann man es so schreiben:

String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing \
elit, sed do eiusmod tempor incididunt ut labore \
et dolore magna aliqua.\
""";
Nach dem Login kopieren

(Video-Tutorial empfohlen:Java-Video-Tutorial)

3. Mustervergleich von Instanzen

Java 14 führt eine Vorschaufunktion ein, mit der es wird nicht mehr benötigt. Schreiben Sie Code, der zunächst eine Instanzbeurteilung und dann eine erzwungene Konvertierung durchführt. Zum Beispiel der folgende Code:

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

Mit dieser Vorschaufunktion kann er umgestaltet werden in:

if (obj instanceof Group group) {
var entries = group.getEntries();
}
Nach dem Login kopieren

Da die bedingte Prüfung erfordert, dass obj vom Typ „Gruppe“ ist, warum müssen Sie es einschließen? es im bedingten Code wie im ersten Code? Was ist mit der Angabe von obj als Gruppentyp im Block? Dies kann zu Fehlern führen.

Diese prägnantere Syntax kann die meisten Umwandlungen in Java-Programmen eliminieren.

JEP 305 erklärt diese Änderung und gibt ein Beispiel aus Joshua Blochs Buch „Effective Java“, das die folgenden zwei äquivalenten Schreibweisen demonstriert:

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

Dieser Absatz Der im Code umgewandelte redundante CaseInsensitiveString kann entfernt und wie folgt konvertiert werden:

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

Diese Vorschaufunktion ist einen Versuch wert, da sie die Tür zu einem allgemeineren Mustervergleich öffnet. Die Idee des Mustervergleichs besteht darin, der Sprache eine praktische Syntax zum Extrahieren von Komponenten aus Objekten basierend auf bestimmten Bedingungen bereitzustellen. Dies ist genau der Anwendungsfall für den Operator „instanceof“, da es sich bei der Bedingung um eine Typprüfung handelt und der Extraktionsvorgang den Aufruf der entsprechenden Methode oder den Zugriff auf ein bestimmtes Feld erfordert.

Mit anderen Worten, diese Vorschaufunktion ist nur der Anfang. In Zukunft wird diese Funktion definitiv mehr Coderedundanz reduzieren und dadurch die Möglichkeit von Fehlern verringern.

4. Aufnahme

Eine weitere Vorschaufunktion ist die Aufnahme. Wie andere zuvor eingeführte Vorschaufunktionen folgt auch diese Vorschaufunktion dem Trend zur Reduzierung redundanten Java-Codes und kann Entwicklern helfen, genaueren Code zu schreiben. Record wird hauptsächlich für Klassen in bestimmten Feldern verwendet. Seine Verschiebungsfunktion besteht darin, Daten ohne benutzerdefiniertes Verhalten zu speichern.

Kommen wir gleich zur Sache und nehmen ein Beispiel der einfachsten Domänenklasse: BankTransaction, die eine Transaktion darstellt und drei Felder enthält: Datum, Betrag und Beschreibung. Bei der Definition einer Klasse sind viele Aspekte zu berücksichtigen:

Konstruktor, Getter, Methode toString(), hashCode() und equal() Der Code für diese Teile wird normalerweise automatisch von der IDE generiert und nimmt einen Platz ein viel Platz. Hier ist die vollständig generierte BankTransaction-Klasse:

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);
}
}
Nach dem Login kopieren

Java 14 bietet eine Möglichkeit, diese Redundanz aufzulösen und den Zweck klarer auszudrücken: Der einzige Zweck dieser Klasse besteht darin, Daten zusammenzuführen. Record stellt Implementierungen der Methoden equal, hashCode und toString bereit. Daher kann die BankTransaction-Klasse wie folgt umgestaltet werden:

public record BankTransaction(LocalDate date,double amount,
String description) {}
Nach dem Login kopieren

Durch Record können Sie „automatisch“ die Implementierung von equal, hashCode und toString sowie die Konstruktor- und Getter-Methoden abrufen.

Um dieses Beispiel auszuprobieren, müssen Sie die Datei mit dem Vorschau-Flag kompilieren:

javac --enable-preview --release 14 Die Felder von BankTransaction.javarecord sind implizit endgültig. Daher können Datensatzfelder nicht neu zugewiesen werden. Es ist jedoch zu beachten, dass dies nicht bedeutet, dass der gesamte Datensatz unveränderlich ist. Die in den Feldern gespeicherten Objekte können veränderbar sein.

5. NullPointerException

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

var name = user.getLocation().getCity().getName();
Nach dem Login kopieren

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

Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)
Nach dem Login kopieren

不幸的是,如果在第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)
Nach dem Login kopieren

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

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

-XX:+ShowCodeDetailsInExceptionMessages
Nach dem Login kopieren

下面是个例子:

java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample
Nach dem Login kopieren

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

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

Das obige ist der detaillierte Inhalt vonWas sind die neuen Funktionen von Java14?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage