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. Business Process Manager (m/w/d)
    Richter-Helm BioLogics GmbH & Co. KG, Bovenau
  2. IT-Recruiter (m/w/d)
    Cegeka Deutschland GmbH, Neu Isenburg, Köln
Detailsuche

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.

Golem Akademie
  1. Advanced Python – Fortgeschrittene Programmierthemen: virtueller Zwei-Tage-Workshop
    27.–28. Januar 2022, Virtuell
  2. First Response auf Security Incidents: Ein-Tages-Workshop
    4. März 2022, Virtuell
Weitere IT-Trainings

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.  


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
Blender Foundation
Blender 3.0 ist da

Die freie 3D-Software Blender bekommt ein Update - wir haben es uns angesehen.

Blender Foundation: Blender 3.0 ist da
Artikel
  1. Bald exklusiv bei Disney+: Serien verschwinden aus Abos von Netflix und Prime Video
    Bald exklusiv bei Disney+
    Serien verschwinden aus Abos von Netflix und Prime Video

    Acht Serienklassiker gibt es bald nur noch exklusiv bei Disney+ im Abo. Dazu gehören Futurama, Family Guy und 24.
    Von Ingo Pakalski

  2. Chorus im Test: Action im All plus galaktische Grafik
    Chorus im Test
    Action im All plus galaktische Grafik

    Schicke Grafik und ein sprechendes Raumschiff: Chorus von Deep Silver entpuppt sich beim Test als düsteres und spannendes Weltraumspiel.
    Von Peter Steinlechner

  3. Edge-Browser: Microsoft will Installation von Chrome verhindern
    Edge-Browser
    Microsoft will Installation von Chrome verhindern

    Microsoft intensiviert sein Vorgehen gegen andere Browser: Vor der Installation von Chrome wird Edge übertrieben gelobt.

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 • Saturn-Advent: Toshiba Canvio 6TB 88€ • KFA2 Geforce RTX 3070 OC 8GB 1.019€ • Netgear günstiger (u. a. 5-Port-Switch 16,89€) • Norton 360 Deluxe 2022 18,99€ • Gaming-Monitore zu Bestpreisen (u. a. Samsung G3 27" FHD 144Hz 219€) • Spiele günstiger (u. a. Hades PS5 15,99€) [Werbung]
    •  /