Java String Templates: JDK-21-Preview, Entfernung in JDK 23 und Alternativen
Auf dieser Seite
String Templates waren Preview-Funktionen in JDK 21 und 22 und wurden in JDK 23 entfernt. --enable-preview stellt STR in JDK 23 nicht wieder her. Code, der über diese Previews hinaus nutzbar bleiben muss, sollte Standard-String-APIs oder einen formatspezifischen Serialisierer verwenden. Oracles Erklärung zur Entfernung beschreibt die Änderung.
Ablauf
Gezeigt wird das standardkonforme FormattingExample, nicht das historische Preview-Beispiel. Es vergleicht drei Formatierungsformen und prüft die Apostrophbehandlung von MessageFormat.
Welches JDK kann das alte Beispiel ausführen?
| JDK | Status von String Templates | Vorgehen |
|---|---|---|
| 21 | Preview | Zum Kompilieren und Ausführen JDK 21 mit aktivierter Preview verwenden. |
| 22 | Zweite Preview | Passenden JDK-22-Compiler, Laufzeit und Preview-Einstellungen verwenden. |
| 23 | Entfernt | Preview-Syntax ersetzen; Flags stellen entfernte Funktionen nicht wieder her. |
Mit --release lässt sich eine ältere Preview-Funktion auf einem neueren Compiler nicht wiederbeleben. Oracles Preview-Leitfaden verlangt den Compiler der jeweiligen Preview-Version.
Das historische JDK-21-Beispiel ausführen
Speichern Sie die vollständige Klasse als Example.java. Dieser Abschnitt erfordert JDK 21, auch wenn ein anderes JDK als Standard eingestellt ist.
public class Example {
public static void main(String[] args) {
int x = 2;
int y = 3;
String result = STR."\{x} plus \{y} equals \{x + y}";
System.out.println(result);
}
}
Prüfen Sie die gewählten Werkzeuge und kompilieren und starten Sie im Verzeichnis der Datei:
javac -version
java -version
javac --enable-preview --release 21 Example.java
java --enable-preview Example
Die Ausgabe lautet 2 plus 3 equals 5. Der Compiler meldet außerdem die Verwendung von Preview-Funktionen. STR wird in dieser JDK-21-Preview implizit importiert; ein fehlender Prozessor in einem späteren JDK lässt sich nicht durch einen Import ergänzen. Siehe JDK-21-Leitfaden zu String Templates.
Preview-Syntax durch Standard-APIs ersetzen
Speichern Sie Folgendes als FormattingExample.java. Es verwendet Standard-APIs ohne Preview-Flags. Die vollständige Klasse funktioniert auf Java 17. Für String.format und MessageFormat wird hier eine explizite Locale angegeben, damit die Zahlenausgabe reproduzierbar ist.
import java.text.MessageFormat;
import java.util.Locale;
public class FormattingExample {
public static void main(String[] args) {
int x = 2;
int y = 3;
System.out.println(x + " plus " + y + " equals " + (x + y));
System.out.println(String.format(Locale.ROOT, "%1$d plus %2$d equals %3$d", x, y, x + y));
MessageFormat format = new MessageFormat("{0} plus {1} equals {2}", Locale.ROOT);
System.out.println(format.format(new Object[] {x, y, x + y}));
System.out.println(new MessageFormat("It''s {0}", Locale.ROOT)
.format(new Object[] {"ready"}));
}
}
javac FormattingExample.java
java FormattingExample
Ausgabe:
2 plus 3 equals 5
2 plus 3 equals 5
2 plus 3 equals 5
It's ready
| Bedarf | Geeignete API | Zu erhaltendes Detail |
|---|---|---|
| Kurzer Ausdruck | + |
Klammern um x + y machen die Berechnung explizit. |
| Wiederholtes Anhängen | StringBuilder |
Hilfreich beim schrittweisen Aufbau von Text. |
| Formatstring | String.format oder .formatted |
%d und %s folgen den Formatter-Regeln; für eine explizite Locale String.format(Locale.ROOT, ...) verwenden. |
| Lokalisiertes Nachrichtenmuster | MessageFormat |
Verwendet nummerierte Argumente, ein Objektarray und andere Quoting-Regeln. |
MessageFormat behandelt einfache Anführungszeichen als Mustersyntax. Das doppelte Zeichen in It''s {0} erzeugt den oben gezeigten wörtlichen Apostroph. Ein %s-Muster durch {0} zu ersetzen bedeutet auch, die API zu wechseln und ihr Locale-Verhalten zu prüfen. MessageFormat-API, String-API.
Formatierung von Kodierung trennen
Weder STR noch gewöhnliche Formatierung macht beliebige Werte zu sicherem JSON, SQL oder HTML. Verwenden Sie für das Zielformat einen JSON-Serialisierer, SQL-Parameterbindung oder HTML-Escaping des Renderers. Ein für einfache Beispielwerte korrekt aussehender String kann bei Anführungszeichen oder Backslashes scheitern.
Beide vollständigen Klassen wurden mit den obigen Befehlen kompiliert und ausgeführt: die Preview auf JDK 21.0.1, die Standardalternative auf JDK 17.0.8.1 und 21.0.1. Die Zeilen zu JDK 22 und 23 beschreiben dokumentierte Funktionshistorie; sie wurden in dieser Umgebung nicht ausgeführt.
Ein JDK-Upgrade verändert auch die Framework-Kompatibilität. Für eine ältere Spring-Anwendung siehe die Migrationsfolge von Spring Boot 2.7 zu 3.0.
Diskussion