News

Java 14 ist da: Das sind die spannendsten neuen Features der neuen Version

Bild: Shutterstock

In Version 14 der alteingesessenen Programmiersprache wurden mehr Java Enhancement Proposals berücksichtigt als je zuvor. Der Großteil der Neuerungen zielt auf eine Sache ab: Java-Entwicklern das Coden zu erleichtern.

Java ist eine objektorientierte Programmiersprache. Die klassenbasierte Sprache wurde 1995 von Sun Microsystems entwickelt, das Unternehmen wurde 2010 von Oracle aufgekauft. Der 14. Release der Programmiersprache kommt mit Switch-Expressions, Pattern-Matching für instanceof und NullPointerExceptions.

Nix mehr verpassen: Die t3n Newsletter zu deinen Lieblingsthemen! Jetzt anmelden

Switch-Expressions

In Java 12 und 13 waren Switch-Expressions bereits als Preview-Feature verfügbar. Vor der Neuerung musstet ihr Switches als Statements schreiben; sie als Expression auszudrücken, war nicht möglich.

Der Unterschied zwischen Statement und Expression?

Folgender Code ist ein Beispiel für ein Statement:

String message = "";
if (condition) {
message = "Hello!";
}
else {
message = "Welcome!";
}

Dasselbe mithilfe des Ternary-Operators ausgedrückt, ist eine Expression:

String message = condition ? "Hello!" : "Welcome!";

Durch die Neuerung sollen verschiedene Fehlerquellen eliminiert werden.

Einen Switch konntet ihr in Java bislang ausschließlich in Form eines Statements ausdrücken:

switch (event) {
case PLAY:
System.out.println("PLAY event!")
break;
case STOP:
System.out.println("STOP event")
break;
default:
System.out.println("Unknown event");
}

Über das break-Statement wird im oben stehenden Code sichergestellt, dass der nächste Block innerhalb des Switch-Statements entsprechend nicht ausgeführt wird. Ohne das break-Statement würde der jeweils nächste Block innerhalb des Statements ausgeführt werden. Dieses Verhalten innerhalb eines Switch-Statements wird auch fall-through-behavior genannt.

Switch-Expressions sind weniger umfangreich, der Zweck des Codes ist klarer ersichtlich und mit ihnen braucht ihr das break-Statement nicht mehr.

var log = switch (event) {
case PLAY -> "User has triggered the play button";
case STOP ->"User needs a break";
default -> "No event to log";
};

Die neue switch-Syntax ist an die lambda-ähnliche Syntax angelehnt, die mit Version 8 Eingang in Java fand: Label -> Code, der einen Wert zurückgibt. Ähnlich wie in einer Lambda-Expression ist es möglich, einzeilige Ausdrücke und Codeblöcke in geschwungenen Klammern innerhalb eines switch-Statements gemeinsam verwenden.

switch (event) {
case PLAY -> {
System.out.println("PLAY event!");
counter++;
}
case STOP -> System.out.println("STOP event");
default -> System.out.println("Unknown event");
};

Außerdem könnt ihr jetzt mehrere Labels für einen Case nutzen:

switch (event) {
case PLAY ->
System.out.println("User has triggered the play button");
case STOP, PAUSE ->
System.out.println("User needs to relax");
};

Vor den neuen Switch-Expressions konnte dasselbe Resultat über das Fallthrough-Verhalten erreicht werden, indem das break-Statement zwischen case STOP und case PAUSE einfach weggelassen wurde:

switch (event) {
case PLAY:
System.out.println("User has triggered the play button");
break;
case STOP:
case PAUSE:
System.out.println("User needs to relax");
break;
}

Dabei ist aber aus dem Code nicht ersichtlich, ob das break-Statement mit Absicht fehlt oder nicht. Die Fälle STOP und PAUSE wie in Beispiel 4 zusammenfassen zu können, bringt eben diese Klarheit und reduziert so die Fehleranfälligkeit. Ein weiterer Vorteil des neuen Switches tritt zutage, wenn ihr switch mit einem enum-Type nutzt:

public enum Event {
PLAY, PAUSE, STOP
}

Der Compiler überprüft jetzt, ob es für jeden möglichen Wert ein passendes switch-Label gibt. Wenn nicht, wirft euer Programm folgende Fehlermeldung:

error: the switch expression does not cover all possible input values.

Text-Blöcke

Auch Text-Blöcke waren in Java 13 bereits als Preview-Feature verfügbar. Die Neuerung soll die Arbeit mit mehrzeiligen String-Literals vereinfachen. In V 14 durchläuft das Feature eine weitere Test-Runde, kommt allerdings mit einigen kleineren Anpassungen. Um mehrzeiligen Text zu formatieren, wurden in Java bislang typischerweise String-Verkettungen und Umbrüche genutzt:

String html = "" +"\n\t" + "" +
"\n\t\t" + "

\"Java 14 is here!\"

" +
"\n\t" + "" +
"\n" + "";

Dank der neuen Schreibweise mit den ””” jeweils am Anfang und am Ende eines Blocks könnt ihr die Verkettungen und Umbrüche in Zukunft weglassen.

String html = """

"Java 14 is here!"

""";

Außerdem wurden in Java 14 zwei neue Escape-Sequenzen hinzugefügt. Zum einen die \s Schreibweise für ein einzelnes Leerzeichen. Zum anderen ein Backslash \ für eine neue Zeile innerhalb eines mehrzeiligen Strings.

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

Kann zukünftig so geschrieben werden:

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

Pattern-Matching für instanceof

Pattern-Matching ist in Java 14 in Form eines Preview-Features verfügbar. Nach instanceof-Conditionals brauchte man bislang einen sogenannten expliziten Cast. Type-Casting in Java bezeichnet den Vorgang, einen Value von einem Datentyp an einen anderen zu deklarieren. Es gibt zwei verschiedene Arten von Type-Conversion in Java: explizites und automatisches Casting. Einen Überblick darüber, was das genau bedeutet, findet ihr in diesem Artikel. Mit dem neuen Pattern-Matching-Feature wird der explizite Cast für instanceof-Conditionals obsolet. Bisher musstet ihr folgenden Code schreiben:

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

Bei aktiviertem Feature geht das zukünftig so:

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

Die kürzere Syntax soll die Fehleranfälligkeit eurer Java-Programme reduzieren.

Records

Ein weiteres Preview-Feature in Java 14 sind Records. Ähnlich wie die anderen Neuerungen in V 14 zielt auch dieses Feature darauf ab, eurem Java-Code die unnötige Komplexität zu nehmen und ihn präziser zu machen. Bei Records geht es darum, Domain-Klassen, deren einziger Zweck es ist, Daten in Fields zu speichern, zukünftig weniger wortreich aufschreiben zu können. Ein Beispiel seht ihr hier:

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);
}
}

Daraus wird folgender Code:

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

Tiefer ins Thema Records einsteigen könnt ihr zum Beispiel in diesem Blogpost.

NullPointerExceptions

In Java 14 gibt es ein neues JVM-Feature, über das ihr zukünftig weitere Informationen über die Ursache von sogenannten NullPointerExceptions bekommt. Das Feature soll für Methoden, Fields, Arrays und Assignments gleichermaßen funktionieren. Details dazu erfahrt ihr im offiziellen Oracle-Blogpost zum neuen Java-Release.

Vielleicht ebenfalls interessant für dich: 

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Schreib den ersten Kommentar!

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!

Hey du! Schön, dass du hier bist. 😊

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team bestehend aus 65 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Danke für deine Unterstützung.

Digitales High Five,
Stephan Dörner (Chefredakteur t3n.de) & das gesamte t3n-Team

Anleitung zur Deaktivierung