Fwd: String templates and constant expressions
Brian Goetz
brian.goetz at oracle.com
Mon Apr 17 14:05:18 UTC 2023
This was received on the -comments list. It raises a question which I
realize now was not explicitly discussed with the EG, but which was
considered in internal discussions: can the result of a string template
ever be considered a constant expression?
At first, one might thing that a string template whose embedded
expressions (and processor) are constant expressions could be a constant
expression. The questioner's motivation is that the arguments of
annotations must be constant expressions, so this would enrich the set
of things we can put in annotations.
Unfortunately, the bar for "constant expression" in the JLS is quite
high (and even that doesn't necessarily get us to annotation
parameters.) For String constants, the compiler would "just" have to
fold the string at compile time -- but it would need need permission
from the spec to do so, which means we have to specify at least part of
the "constant folding" story for a very narrow and ad-hoc benefit, and
which would likely lead to an RFE tail of "can you please allow XYZ to
be a constant expression". And for types more interesting than
String/int/friends, we'd have to do more -- we'd have to update the
specification of annotations to support types other than the set of
types that currently have an encoding in JVMS 4.7.16. (We explored this
for an arguably more valuable use case -- method references as
annotation parameters -- and while there was nothing wrong with that in
principle, there was significant work in the classfile spec, VM,
compiler, and reflection (and ASM and friends) to plumb it end to end,
and this didn't make the priority cut.)
So the short answer to the question is "no", and the slightly longer
answer is "you want constant folding, but we're not going to do constant
folding in little ad-hoc bits."
-------- Forwarded Message --------
Subject: String templates and constant expressions
Date: Sat, 15 Apr 2023 19:46:07 +0200
From: Jens Lideström <jens at lidestrom.se>
To: amber-spec-comments at openjdk.java.net
Dear experts and observers,
A recent message in the thread "Revisit the String template syntax"
compared the Spring property annotation syntax with the proposed String
template syntax.
@Value("${myproperty}")
private String myproperty;
I have the somewhat vague question: Are there any relation between the
use case of these property annotations and the use case of string templates?
The argument of the @Value annotation must be a String constant expression.
Can a string template be used as a constant expression? Maybe if all its
arguments are themselves are constants? Could a property syntax such as
Spring's use string templates?
Could code like the following do anything sensible?:
@Value("\{someTemplateArg}")
private String someField;
Maybe like this:
@Value("\{MyProperties.SOME_PROPERTY_KEY}")
private String someField;
Maybe there is no relation and the answer is simply "no". But maybe it
worth to think about.
I don't see constant expressions mentioned in the JEP:
https://openjdk.org/jeps/430
Regards,
Jens Lideström
PS: This feature in general seems very good to me.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-experts/attachments/20230417/6937210e/attachment.htm>
More information about the amber-spec-experts
mailing list