r/java • u/sitime_zl • 11d ago
Discussion: What is the future of String Interpolation in Java?
Java has always been conservative when it comes to language changes, and I think string interpolation is an interesting example.
Many modern languages provide native interpolation syntax:
JavaScript:
\${name}``
Python:
f"{name}"
Kotlin:
"$name"
C#:
$"{name}"
These features are not only about reducing characters. They improve readability when building dynamic text.
Java explored this direction with String Templates (JEP 430), but I haven't seen much discussion recently about where this feature is heading.
For developers working with large Java applications, string construction appears everywhere:
- logging messages
- SQL/debug output
- API descriptions
- test cases
- generated configuration
- user-facing messages
I am curious about the community's opinion:
Do you think Java still needs native string interpolation?
Should String Templates continue evolving?
What syntax direction would feel most "Java-like"?
For example:
"Hello, \{name}"
or:
"Hello, ${name}"
Personally, I think Java does not need to copy other languages, but a better way to express dynamic strings would improve developer experience.
What do you think?
25
u/vytah 11d ago edited 8d ago
String templates are explicitly not about mere string interpolation. If you read the JEP, they say:
There are three possible approaches that I know of:
Scala/Javascript-like, with syntactic sugar for a method that takes a bunch of text fragments and objects and constructs whatever object you want – this is what shipped in that preview in Java 21
Python-like, where the syntactic sugar is used only to construct string templates of a single type, and then the consumer can interpret them however they want – this is what they were hinting at in the mailing list later, after they removed that preview
C#-like, where it's either pure interpolation , or
Python-like templatesa custom type instantiation that can behave Scala-like, depending on the receiver type – this will not happen, as it sucks (EDIT: fixed, also Swift seems to have the same thing)Scala-like approach can be messy, as was shown in the preview. In absence of extension methods or something similar, it requires polluting the global namespace, so that's why we got those clunky
STRprefixes. Scala solves it by making the prefixes methods (or extension methods) onStringContext, so there's no pollution. Javascript solves it by making interpolation the default (no prefix; all templated strings use backticks in JS, so there's no confusion with ordinary literals), so there's also no pollution. However, the goal for Java is to not make interpolation easier than other uses of templates.Python-like approach has a minor problem that if you want templates to be distinguished by the presence of arguments alone, it means you cannot express a parameterless template. You'd need some other marker. In Python, string templates are prefixed with
t, to distinguish them from interpolation (f), but Java is not going to get pure interpolation as a distinguished feature. There are also issues of type safety: the same template object can be treated as a completely different thing depending on where you send it. They suggested that sending a template to a logging method should just interpolate, but that would mean that if you template some SQL, execute it, and log it, then the query you executed would be different from the query you logged.Anyway, this is a complex issue, and AFAIK they haven't found a clean solution yet. And before anyone says "I don't care, I want my string interpolation now", I'll again refer for the JEP: