← Notizen

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.

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

Auf GitHub ansehen ↗