• IT-Karriere:
  • Services:

Einrückung und Formatierung der Textblöcke

Beim vorherigen Beispiel jsonBlock heißt das, dass öffnende und schließende Klammern am Anfang ihrer jeweiligen Zeile stehen sollen, während die drei Zeilen dazwischen jeweils mit einem Tab eingerückt sind.

Stellenmarkt
  1. Allianz Deutschland AG, München Unterföhring
  2. Claudius Peters Projects GmbH, Buxtehude

Um das zu ermöglichen, wendet der Compiler einen nicht uninteressanten Algorithmus an, der sich wie folgt auswirkt:

1. Alle Zwischenraumzeichen werden gleich behandelt - insbesondere ein Leerzeichen wie ein Tab.
2. Es werden aus allen nichtleeren Zeilen gleich viele führende Zwischenraumzeichen entfernt und zwar genau so viele, dass mindestens eine Zeile nicht mehr mit einem solchen Zeichen beginnt.
3. Falls die schließenden Anführungszeichen in einer eigenen Zeile stehen, wird diese im vorherigen Schritt ebenfalls berücksichtigt.

Punkt 2 führt dazu, dass das jsonBlock das gewünschte Ergebnis enthält. Denn egal wie weit der Code eingerückt ist, genau diese Einrückung wird als nebensächlich erkannt und entfernt. Was aber tun, wenn alle Zeilen eingerückt sein und zum Beispiel mit einem Tab beginnen sollen?

Einrückung variieren - durch Formatierung

Soll die Einrückung variiert werden, kommt Punkt 3 ins Spiel: Da die Zeile mit den schließenden Anführungsstrichen bei der Bestimmung der zu entfernenden Zeichen berücksichtigt wird, werden nie mehr Zwischenraumzeichen entfernt als die letzte Zeile enthält. Effektiv werden die anderen Zeilen an den schließenden Anführungsstrichen ausgerichtet. Werden sie weiter eingerückt, spiegelt sich das im Ergebnis wider.

  1. String jsonIndentBlock = """
  2. {
  3. greeting: "Hallo",
  4. audience: "Welt",
  5. punctuation: "!"
  6. }
  7. """;

In diesem Beispiel beginnen die sechs Zeilen, die bei der Bestimmung der Einrückung berücksichtigt werden, mit 2, 3, 3, 3, 2, bzw. 1 Tab. Der Compiler wird also einen Tab entfernen. Im Ergebnis bleiben alle anderen Zeilen mit einem Tab (öffnende und schließende Klammer) beziehungsweise zwei Tabs (restliche drei Zeilen) eingerückt.

Da man für zusätzliche Einrückung die Zeileninhalte relativ zu den schließenden Anführungsstrichen positionieren muss, bedeutet das im Umkehrschluss, dass die """ in einer eigenen Zeile stehen müssen. Wie eingangs erwähnt, hängt das einen Zeilenumbruch an das Ende des Strings. Was macht man nun, wenn man zwar die Einrückung will, aber nicht den Zeilenumbruch? Hier kommen die neuen Methoden der Klasse String ins Spiel.

Einrückung variieren - mit String-Methoden

Seit Java 12 gibt es die Methode String::indent, um alle Zeilen eines Strings mit der übergebenen Anzahl von Leerzeichen einzurücken:

  1. String jsonIndentMethod = """
  2. {
  3. greeting: "Hallo",
  4. audience: "Welt",
  5. punctuation: "!"
  6. }""".indent(4);

In jsonIndentMethod stehen vor der öffnenden und schließenden Klammer jeweils vier Leerzeichen. Bei den anderen drei Zeilen ist es etwas unübersichtlicher: Sie beginnen mit jeweils vier Leerzeichen plus der Einrückung entsprechend der Formatierung des Quellcodes. Ist dieser mit vier Leerzeichen eingerückt, ergibt sich das sehr gut. Sind es aber zum Beispiel zwei Leerzeichen oder ein Tab, ist die sich ergebende Einrückung etwas holprig. Eine bequeme Lösung gibt es dafür leider nicht.

Geht man aber von einer Einrückung mit vier Leerzeichen aus, ist jsonIndentMethod beinahe identisch mit jsonIndentBlock. Der einzige Unterschied ist, dass Letzterer mit einem Zeilenumbruch endet. Möchte man das nicht und braucht trotzdem Einrückung vor jeder Zeile, greift man also wie beschrieben zu String::indent.

In Java 13 wurde außerdem String::stripIndent hinzugefügt. Diese Methode entfernt Einrückungen nach genau der gleichen Logik wie der Compiler. Im folgenden String indentedJsonLiteral ist jede Zeile mit mindestens einem Tab eingerückt:

  1. String indentedJsonLiteral = ""
  2. + " {\n"
  3. + " greeting: \"Hallo\",\n"
  4. + " audience: \"Welt\",\n"
  5. + " punctuation: \"!\"\n"
  6. + " }\n";

Der zusätzliche Tab macht indentedJsonLiteral ungleich dem einleitenden jsonBlock, aber stripIndent<String jsonBlock = """ behebt das und indentedJsonLiteral.stripIndent().equals(jsonBlock) ist wahr.

Formatierung von Textblöcken

Jim Laskey und Stuart Marks von Oracle haben einen Entwicklerleitfaden zu Textblöcken verfasst, der sehr lesenswert ist. Er enthält diese zehn Empfehlungen (leicht umformuliert und ohne die elfte):

1. Man sollte Textblöcke dort verwenden, wo sie die Lesbarkeit des Codes verbessern, also insbesondere bei mehrzeiligen Strings.
2. Wenn ein String ohne Konkatenation und Einfügen von \n in eine Zeile passt, sollte er wahrscheinlich eher als Literal definiert werden.
3. Es spricht nichts dagegen, Escape-Sequenzen wie \n in Textblöcken zu verwenden, wenn das die Lesbarkeit fördert.
4. In dem meisten Fällen sollten die drei öffnenden Anführungsstriche am Ende ihrer Zeile stehen und die drei schließenden in ihrer eigenen.
5. Textzeilen und schließende Anführungsstriche sollten nicht an den öffnenden Anführungsstrichen ausgerichtet werden.
6. Statt Textblöcke innerhalb komplexerer Ausdrücke wie Stream Pipelines zu verwenden, sind sie zugunsten der Lesbarkeit meist besser in lokalen Variablen oder statischen Konstanten aufgehoben.
7. Wegen der Gleichbehandlung von einem Tab und einem Leerzeichen sollten Textblöcke nur mit einem der beiden Zeichen eingerückt werden, um ungleichmäßige Ergebnisse zu vermeiden.
8. Wenn ein Textblock mehr als drei Anführungsstriche in Folge enthalten soll, reicht ein Escaping des jeweils ersten von drei.
9. Textzeilen sollten standardmäßig gemäß der üblichen Formatierung ausgerichtet werden.
10. Enthalten Textblöcke sehr lange Zeilen, kann horizontales Scrolling verhindert werden, indem die Zeilen ganz links ausgerichtet werden.

Damit sind neben technischen Erwägungen wie Syntax, Deduplizierung, Normalisierung der Zeilenenden und Umgang mit Einrückung auch stilistische abgedeckt. Noch etwas mehr Informationen gibt es in diesem Blogpost zu Textblöcken.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Textblöcke und String-Literale sind ununterscheidbarWas es in Java 13 sonst noch gibt 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6.  


Anzeige
Hardware-Angebote
  1. (reduzierte Überstände, Restposten & Co.)

sambache 23. Sep 2019

Kurven und Graphen sind die Visualisierung von Zahlen. Symbole sind Strings der Länge 1...

Sybok 19. Sep 2019

Ach von Perl kommt es. OK, gut zu wissen. Für Murks halte ich es dennoch nicht, wenn es...

Sybok 19. Sep 2019

Ganz ehrlich: Ohne mich weiter informiert zu haben sagt mir mein Bauchgefühl auch, dass...

hl_1001 18. Sep 2019

Danke, stimmt. Habe auch bei meinem Umstieg von Java auf C# bald gesehen wie weit hinten...

CSCmdr 18. Sep 2019

Würde vielleicht helfen, ein paar Zeilenumbrüche mit entsprechenden Einrückungen zu...


Folgen Sie uns
       


Honor Magicbook Pro im Test: Viel richtig gemacht für 900 Euro
Honor Magicbook Pro im Test
Viel richtig gemacht für 900 Euro

Eine gute Tastatur und solide Leistung dank AMD-CPU im 16-Zoll-Format: Das Magicbook Pro ist Honors gelungener Start in Europa.
Ein Test von Oliver Nickel

  1. Honor Magicbook Pro mit Ryzen imitiert Macbook Pro für 800 Euro
  2. Honor 9X Pro Honor verkauft fehlende Google-Apps als Feature

Geforce RTX 3090 ausverkauft: Einmal Frust für 1.500 Euro, bitte!
Geforce RTX 3090 ausverkauft
Einmal Frust für 1.500 Euro, bitte!

Erst Vorfreude, dann Ernüchterung und Wut: Der Kauf der Geforce-RTX-3090-Grafikkarte wird zu einer Reise ohne Ziel, dafür mit Emotionen.
Ein IMHO von Oliver Nickel

  1. Ampere-Grafikkarten Kondensatoren sind der Grund für instabile Geforce RTX 3080

iPad 8 und iPad OS 14 im Test: Kritzeln auf dem iPad
iPad 8 und iPad OS 14 im Test
Kritzeln auf dem iPad

Das neue iPad 8 ist ein eher unauffälliger Refresh seines Vorgängers, bleibt aber eines der lohnenswertesten Tablets. Mit iPad OS 14 bekommt zudem der Apple Pencil spannende neue Funktionen.
Ein Test von Tobias Költzsch

  1. iPad-Betriebssystem iPadOS 14 macht Platz am Rand
  2. Zehntes Jubiläum Auch Microsoft hat das erste iPad überrascht

    •  /