string templates javastring templates java
HappyCoders Glasses

String Templates in Java

Sven Woltmann
Sven Woltmann
Aktualisiert: 27. November 2024

Breaking News: Am 05.04.2024 hat Gavin Bierman bekanntgegeben, dass String Templates in der hier beschriebenen Form nicht veröffentlicht werden. Es besteht Einigkeit darüber, dass das Design geändert werden soll, es besteht allerdings kein Konsens darüber, wie es geändert werden soll. Die Sprachentwickler wollen sich nun Zeit nehmen, das Design zu überarbeiten. String Templates werden daher in Java 23 nicht weiter enthalten sein, auch nicht mit --enable-preview.

In diesem Artikel erfährst du:

  • Wie vereinfachen String Templates die Zusammensetzung von Strings aus Text, Variablen und berechneten Werten?
  • Was ist ein Template-Prozessor?
  • Welche Template-Prozessoren gibt es?

String Templates wurden in Java 21 im Rahmen von Project Amber als Preview-Feature eingeführt. In Java 22 wurden sie ohne Änderungen in eine zweite Preview-Runde geschickt.

Status Quo der String-Verkettung

Um Strings zur Laufzeit anhand von Variablen und berechneten Werten zusammenzusetzen, gibt es verschiedene Möglichkeiten. Die geläufigsten sind die folgenden:

int a = ...;
int b = ...;

String concatenated = a + " times " + b + " = " + a * b;
String format       = String.format("%d times %d = %d", a, b, a * b);
String formatted    = "%d times %d = %d".formatted(a, b, a * b);Code-Sprache: Java (java)

Oft wird auch ein StringBuilder, weniger oft java.text.MessageFormat eingesetzt. Aber keine der verfügbaren Varianten ist wirklich gut zu lesen.

String-Interpolation mit String Templates

Nahezu jede moderne Programmiersprache bietet die Möglichkeit der String-Interpolation, d. h. die Möglichkeit, Platzhalter in einem String auszuwerten und sie durch das Ergebnis dieser Auswertung zu ersetzen.

Genau das (und noch mehr, s. u.) ermöglichen die durch JDK Enhancement Proposal 430 eingeführten „String Templates”.

Damit können wir das Beispiel von oben wie folgt umschreiben:

int a = ...;
int b = ...;

String interpolated = STR."\{a} times \{b} = \{a * b}";Code-Sprache: Java (java)

Zur Laufzeit wird der Platzhalter \{a} durch den Wert der Variablen a ersetzt und der Platzhalter \{b} durch den Wert der Variablen b.

Die durch \{...} gekennzeichneten Platzhalter dürfen nicht nur Variablen und arithmetische Ausdrücke enthalten – sie können jeden beliebigen Java-Ausdruck enthalten, z. B. einen statischen Methodenaufruf:

String interpolated = STR."\{a} times \{b} = \{Math.multiplyExact(a, b)}";Code-Sprache: Java (java)

Der Platzhalter darf auch Anführungszeichen enthalten, und der Übersicht halber kannst du ihn auf mehrere Zeilen aufteilen und mit Kommentaren versehen (an dieser Stelle muss ich allerdings das WordPress-Syntax-Highlighting-Plugin abschalten, da der folgende Code es überfordern würde):

String dateMessage = STR."Today's date: \{
        LocalDate.now().format(
                  // We could also use DateTimeFormatter.ISO_DATE
                  DateTimeFormatter.ofPattern("yyyy-MM-dd")
        )}";Code-Sprache: Klartext (plaintext)

String Templates können auch mit mehrzeiligen Strings verwendet werden:

int    httpStatus   = ...;
String errorMessage = ...;

String json = STR."""
    {
      "httpStatus": \{httpStatus},
      "errorMessage": "\{errorMessage}"
    }""";Code-Sprache: Klartext (plaintext)

Falls du dich gefragt hast, was das STR. vor den Strings zu bedeuten hat – die Antwort findest du im nächsten Abschnitt.

String Template Processor

STR ist der Name eines sogenannten Template Processors (genauer gesagt: eine automatisch in jede Java-Datei importierte Konstante vom Typ StringTemplate.Processor). Ein Template Processor definiert, wie Template-Text und Platzhalter zu einem Ergebnis zusammengesetzt werden. Im Fall des STR-Template-Prozessors werden – wie oben beschrieben – die Java-Ausdrücke in den Platzhaltern aufgelöst und die Platzhalter durch die dabei herauskommenden Werte ersetzt.

FMT Template Processor

Ein weiterer Template Processor ist FMT. Dieser wertet den Platzhaltern vorangestellte Formatierungsangaben – wie wir sie auch von String.format() kennen – aus.

Hier noch einmal unser Multiplikationsbeispiel mit Fließkommazahlen, die mit dem FMT-Template-Prozessor auf zwei Stellen nach dem Komma gerundet werden:

double a = ...;
double b = ...;

String interpolated = FMT."%.2f\{a} times %.2f\{b} = %.2f\{a * b}";Code-Sprache: Java (java)

SQL Template Processor

Ein Template Processor muss übrigens nicht zwangsläufig einen String zurückliefern. So könnte z. B. ein Template Processor implementiert werden, der SQL-Kommandos zusammenstellt und ein SQL-Statement zurückliefert – und ganz nebenbei noch vor Injektionsangriffen schützt:

String searchQuery = ...
Statement statement = SQL."""
    SELECT * FROM User u
    WHERE u.userName LIKE '%\{searchQuery}%'""";Code-Sprache: Java (java)

Wenn du noch tiefer in die Materie einsteigen willst, empfehle ich dir den JDK Enhancement Proposal 459 zu lesen. Dort erfährst du auch, wie du deinen eigenen Template Processor schreiben kannst und dass ein Template Processor nicht immer einen String zurückliefern muss.

Du willst über alle neue Java-Features auf dem Laufenden sein? Dann klicke hier, um dich für den HappyCoders-Newsletter anzumelden.