

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}
a
ersetzt und der Platzhalter \{b}
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.