• IT-Karriere:
  • Services:

Textblöcke und String-Literale sind ununterscheidbar

Hat der Compiler den Block geprüft und in einen String übersetzt, ist das Ergebnis ununterscheidbar von einem üblichen String-Literal mit gleichem Inhalt. Im obigen Beispiel heißt das, dass jsonBlock.equals(jsonPhrase) wahr ist.

Stellenmarkt
  1. IT-Systemhaus der Bundesagentur für Arbeit, Nürnberg
  2. 3C Holding GmbH, Rheda-Wiedenbrück

Der Compiler geht aber noch einen Schritt weiter. String-Konstanten werden beim Kompilieren dedupliziert, um zur Laufzeit Speicher zu sparen. Dadurch sind gleiche Literale nicht nur equal, sondern auch nach == identisch. Das ist praktisch, wenn an vielen Stellen im Code die gleichen Schnipsel auftauchen, kann aber sehr unangenehm sein, wenn man das vergisst und zum Beispiel einen String als Sperre verwendet.

Dieser Mechanismus wird unabhängig davon angewandt, ob ein String mit einem Literal oder einem Textblock erstellt wurde. Das heißt konkret, dass sogar jsonBlock == jsonPhrase wahr ist. Textblöcke sind also ein reines Compiler Feature und zur Laufzeit lässt sich nicht unterscheiden, wie eine String-Instanz im Code definiert wurde.

Normalisierung der Zeilenenden

Ein interessanter Aspekt von Textblöcken ist, dass sich hier Eigenschaften der Textdateien, die den Quellcode enthalten, mit der Semantik des Codes vermischen. Offensichtlich wird dies bei Zeilenenden: Ob Zeilen mit \r\n (CRLF - üblich unter Windows) oder \n (LF - üblich unter Unix) enden, ist eine reine Konfigurationsfrage, aber wenn der Compiler diese stillschweigend übernimmt, wirkt sich das bis auf die erzeugten Strings aus - das wäre unangenehm. Ähnliches gilt für Zwischenraumzeichen, die am Ende einer Zeile stehen, da diese nur selten sichtbar sind und deren Übernahme in den String leicht Verwirrung stiften kann.

Deswegen normalisiert der Compiler Zeilenenden, indem er alle Zwischenraumzeichen nach dem letzten anderen Zeichen entfernt und alle Zeilenumbruchkombinationen (also \r, \r\n und \n) durch \n ersetzt. Da Escape-Sequenzen normal ausgewertet werden (und zwar nach dieser Normalisierung), kann man CRLF erzeugen, indem man Zeilen mit der Sequenz \r enden lässt:

  1. String windows = """
  2. Windows\r
  3. line\r
  4. endings\r
  5. """

Spannender und ein wenig komplizierter als bei Zeilenenden wird es bei der Einrückung. Hier müssen Entwickler und Compiler zwischen nebensächlicher und absichtlicher Einrückung unterscheiden: Die Einrückung des Codes aufgrund der Formatierung sollte keine Auswirkungen auf den erstellten String haben - sie ist nebensächlich. Darüber hinausgehende Einrückung sollte aber als absichtlich erkannt werden und sich im Ergebnis wiederfinden.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Programmiersprache: Java 13 bringt mehrzeilige Strings mit TextblöckenEinrückung und Formatierung der Textblöcke 
  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
       


    •  /