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. Datenkoordinator*in (m/w/d)
    Universitätsmedizin der Johannes Gutenberg-Universität Mainz, Mainz
  2. IT-Mitarbeiter (m/w/d) First-Level-Support
    Stadtwerke Emmendingen GmbH, Emmendingen
Detailsuche

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

Golem Akademie
  1. Hands-on C# Programmierung: virtueller Zwei-Tage-Workshop
    1.–2. Dezember 2021, virtuell
  2. C++ Programmierung Basics: virtueller Fünf-Tage-Workshop
    13.–17. Dezember 2021, virtuell
Weitere IT-Trainings

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.  


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...



Aktuell auf der Startseite von Golem.de
Mica statt Aero
Windows 11 bringt Transparenzeffekte zurück

Weitere Applikationen werden mit einem bekannten Designelement ausgestattet: Windows 11 implementiert Transparenzeffekte mit Mica.

Mica statt Aero: Windows 11 bringt Transparenzeffekte zurück
Artikel
  1. Air4: Renault 4 als Flugauto neu interpretiert
    Air4
    Renault 4 als Flugauto neu interpretiert

    Der Air4 ist Renaults Idee, wie ein fliegender Renault 4 aussehen könnte. Mit der Drohne wird das 60jährige Jubiläum des Kultautos gefeiert.

  2. Gigafactory Berlin: Tesla verzichtet für Akkufertigung auf staatliche Förderung
    Gigafactory Berlin
    Tesla verzichtet für Akkufertigung auf staatliche Förderung

    Tesla verzichtet für die geplante Akkufertigung in Grünheide bei Berlin auf eine mögliche staatliche Förderung in Milliardenhöhe.

  3. MS Satoshi: Die abstruse Geschichte des Bitcoin-Kreuzfahrtschiffs
    MS Satoshi
    Die abstruse Geschichte des Bitcoin-Kreuzfahrtschiffs

    Kryptogeld-Enthusiasten kauften ein Kreuzfahrtschiff und wollten es zum schwimmenden Freiheitsparadies machen. Allerdings scheiterten sie an jeder einzelnen Stelle.
    Von Elke Wittich

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Black Friday Wochenende • LG UltraGear 34GP950G-B 999€ • SanDisk Ultra 3D 500 GB M.2 44€ • Boxsets (u. a. Game of Thrones Blu-ray 79,97€) • Samsung Galaxy S21 128GB 777€ • Premium-Laptops (u. a. Lenovo Ideapad 5 Pro 16" 829€) • MS Surface Pro7+ 888€ • Astro Gaming Headsets [Werbung]
    •  /