• 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. Dr. Richter Heidelberger GmbH & Co. KG, Raum Heilbronn
  2. Fiducia & GAD IT AG, Karlsruhe, München, Münster

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. Advanced Python - Fortgeschrittene Programmierthemen
    3./4. Mai 2021, online
  2. IT-Sicherheit für Webentwickler
    31. Mai - 1. Juni 2021, online
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.  


Anzeige
Hardware-Angebote
  1. (u. a. Ryzen 5 5600X 358,03€)

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
       


Honda E Probe gefahren

Der Honda E ist ein Elektro-Kleinwagen, dessen Design an alte Honda-Modelle aus den 1970er Jahren erinnert.

Honda E Probe gefahren Video aufrufen
Programm für IT-Jobeinstieg: Hoffen auf den Klebeeffekt
Programm für IT-Jobeinstieg
Hoffen auf den Klebeeffekt

Aktuell ist der Jobeinstieg für junge Ingenieure und Informatiker schwer. Um ihnen zu helfen, hat das Land Baden-Württemberg eine interessante Idee: Es macht sich selbst zur Zeitarbeitsfirma.
Ein Bericht von Peter Ilg

  1. Arbeitszeit Das Sechs-Stunden-Experiment bei Sipgate
  2. Neuorientierung im IT-Job Endlich mal machen!
  3. IT-Unternehmen Die richtige Software für ein Projekt finden

Weclapp-CTO Ertan Özdil: Wir dürfen nicht in Schönheit und Perfektion untergehen!
Weclapp-CTO Ertan Özdil
"Wir dürfen nicht in Schönheit und Perfektion untergehen!"

Der CTO von Weclapp träumt von smarter Software, die menschliches Eingreifen in der nächsten ERP-Generation reduziert. Deutschen Perfektionismus hält Ertan Özdil aber für gefährlich.
Ein Interview von Maja Hoock


    Fiat 500 als E-Auto im Test: Kleinstwagen mit großem Potenzial
    Fiat 500 als E-Auto im Test
    Kleinstwagen mit großem Potenzial

    Fiat hat einen neuen 500er entwickelt. Der Kleine fährt elektrisch - und zwar richtig gut.
    Ein Test von Peter Ilg

    1. Vierradlenkung Elektrischer GMC Hummer SUV fährt im Krabbengang seitwärts
    2. MG Cyberster MG B Roadster mit Lasergürtel und Union Jack
    3. Elektroauto E-Auto-Prämie übersteigt in 2021 schon Vorjahressumme

      •  /