Java-Textblöcke

1. Einleitung

In einem früheren Tutorial haben wir gesehen, wie wir mehrzeilige Zeichenfolgen in jeder Java-Version verwenden können, ohne die Vorschaufunktionen zu aktivieren.

In diesem Tutorial erfahren Sie, wie Sie die JDK 13/14-Vorschaufunktion für Textblöcke verwenden .

2. Verwendung

Seit Java 13 stehen Textblöcke als Vorschaufunktion zur Verfügung. Textblöcke beginnen mit einem "" (drei doppelte Anführungszeichen), gefolgt von einem optionalen Leerzeichen und einer neuen Zeile. Das einfachste Beispiel könnte folgendermaßen aussehen:

String example = """ Example text""";

Beachten Sie, dass der Ergebnistyp eines Textblocks immer noch eine Zeichenfolge ist . Textblöcke bieten uns nur eine andere Möglichkeit, String- Literale in unseren Quellcode zu schreiben .

Innerhalb der Textblöcke können wir Zeilenumbrüche und Anführungszeichen frei verwenden, ohne dass ein Escapezeichen erforderlich ist . Es ermöglicht uns, Literalfragmente von HTML, JSON, SQL oder was auch immer wir benötigen, auf elegantere und lesbarere Weise einzuschließen.

In dem erhaltenen String, der (Basis) und die erste Vertiefung Neue - Zeile sind nicht enthalten. Wir werden uns im nächsten Abschnitt die Übergabe von Einrückungen ansehen.

3. Einrückung

Glücklicherweise können wir bei der Verwendung von Textblöcken unseren Code immer noch richtig einrücken. Um dies zu erreichen, wird ein Teil der Einrückung als Quellcode behandelt, während ein anderer Teil der Einrückung als Teil des Textblocks betrachtet wird. Damit dies funktioniert, überprüft der Compiler alle nicht leeren Zeilen auf die minimale Einrückung. Als nächstes verschiebt der Compiler den gesamten Textblock nach links.

Stellen Sie sich einen Textblock vor, der HTML enthält:

public String getBlockOfHtml() { return """   example text  """; }

In diesem Fall beträgt die minimale Einrückung 12 Leerzeichen. Somit sind alle 12 Leerzeichen links vonund in allen nachfolgenden Zeilen werden entfernt. Lassen Sie uns dies testen:

@Test void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { String expected = "\n" + "\n" + " \n" + " example text\n" + " \n" + ""; assertThat(subject.getBlockOfHtml()).isEqualTo(expected); } @Test void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() { String expected = "\n\n \n example text\n \n"; assertThat(subject.getBlockOfHtml()) .isEqualTo(expected); }

Wenn wir einen expliziten Einzug benötigen , können wir für eine nicht leere Zeile (oder die letzte Zeile) weniger Einrückungen verwenden:

public String getNonStandardIndent() { return """ Indent """; } @Test void givenAnIndentedString_thenMatchesIndentedOldStyle() { assertThat(subject.getNonStandardIndent()) .isEqualTo(" Indent\n"); }

Darüber hinaus können wir auch Escapezeichen in Textblöcken verwenden, wie wir im nächsten Abschnitt sehen werden.

4. Flucht

Innerhalb von Textblöcken müssen doppelte Anführungszeichen und Zeilenumbrüche nicht maskiert werden. Wir können jedoch Escape verwenden, um beispielsweise Zeilenumbrüche ( \ r ) oder Tabulatoren ( \ t ) zu einem Textblock hinzuzufügen . Wir könnten sogar wieder "" in unserem Textblock verwenden, indem wir eines der doppelten Anführungszeichen umgehen:

public String getTextWithEscapes() { return """ fun with\n whitespace\t\r and other escapes \""" """; }

Beachten Sie, dass es als schlechte Praxis angesehen wird, sie zu maskieren, da einfache doppelte Anführungszeichen und Zeilenumbrüche nicht maskiert werden müssen.

Beachten Sie außerdem, dass selbst wenn eine Quelldatei Windows-Zeilenenden ( \ r \ n ) hat, die Textblöcke nur mit Zeilenumbrüchen ( \ n ) abgeschlossen werden . Wenn Wagenrückläufe ( \ r ) vorhanden sein müssen, müssen sie explizit zum Textblock hinzugefügt werden:

public String getTextWithCarriageReturns() { return """ separated with\r carriage returns"""; } @Test void givenATextWithCarriageReturns_thenItContainsBoth() { assertThat(subject.getTextWithCarriageReturns()) .isEqualTo("separated with\r\ncarriage returns"); }

5. Formatierung

Um die Variablensubstitution zu erleichtern , wurde eine neue Methode hinzugefügt, mit der die String.format- Methode direkt in einem String-Literal aufgerufen werden kann:

public String getFormattedText(String parameter) { return """ Some parameter: %s """.formatted(parameter); }

Alle diese Funktionen bieten bereits eine sehr leistungsstarke Funktion. Java 14 enthält jedoch einige zusätzliche Funktionen. Wir werden als nächstes mehr darüber sehen.

6. Neue Escape-Sequenzen in Java 14

Die zweite Vorschau der Funktion "Textblöcke" fügt zwei zusätzliche Escape-Sequenzen hinzu.

6.1. Escaping Line Terminators

Manchmal enthält unser Quellcode lange Textzeilen, die wir lesbar formatieren möchten. In der zweiten Vorschau wurde eine Funktion hinzugefügt, mit der wir dies tun können. Wir können einer neuen Zeile entkommen, damit sie ignoriert wird :

public String getIgnoredNewLines() { return """ This is a long test which looks to \ have a newline but actually does not"""; }

Tatsächlich entspricht dieses String- Literal nur einem normalen, nicht unterbrochenen String :

@Test void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() { String expected = "This is a long test which looks to have a newline but actually does not"; assertThat(subject.getIgnoredNewLines()) .isEqualTo(expected); }

6.2. Fluchträume

Der Compiler ignoriert alle nachgestellten Leerzeichen in Textblöcken . Seit der zweiten Vorschau können wir jedoch mit den neuen Escape-Sequenzen ein Leerzeichen maskieren . Der Compiler behält auch alle Leerzeichen vor diesem maskierten Leerzeichen bei.

Schauen wir uns die Auswirkungen eines entkommenen Raums genauer an:

public String getEscapedSpaces() { return """ line 1······· line 2·······\s """; } @Test void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() { String expected = "line 1\nline 2 \n"; assertThat(subject.getEscapedSpaces()) .isEqualTo(expected); } 

Hinweis : Die Leerzeichen im obigen Beispiel werden durch das Symbol '·' ersetzt, um sie sichtbar zu machen.

Der Compiler entfernt die Leerzeichen aus der ersten Zeile. Die zweite Zeile wird jedoch mit einem maskierten Leerzeichen abgeschlossen, und alle Leerzeichen bleiben somit erhalten.

7. Fazit

In diesem kurzen Tutorial haben wir uns die Funktion Java Text Blocks angesehen. Es ist vielleicht kein Game-Changer, aber es hilft uns, besseren und besser lesbaren Code zu schreiben, was im Allgemeinen eine gute Sache ist.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.