为什么Java的字符串模板使用笨拙的STR前缀?

问题描述 投票:0回答:1

Java终于支持字符串插值了!我对此感到非常高兴。然而,在我看来,语法有点笨拙

// string templating syntax from Java 23

String greeting = STR."Hello \{name}!";

具体来说,我对

STR
前缀的必要性表示怀疑,它添加了多达四个额外字符(算上点)。此外,看起来我正在查询全局
STR
对象上的一些不寻常的静态属性,这增加了混乱

很明显,出于向后兼容性的原因,它不能只是“Hello /{name}!”因为理论上在现有的 Java 代码中可能存在一个文字字符串“{name}”。然而,其他语言的解决方案似乎可以更好地解决这个问题

  1. 反引号,a-la JS(他们可以对文本块使用三个反引号)。添加零个额外字符
String greeting = `Hello, \{name}!`;
  1. 美元符号,a-la C#。添加一个额外字符
String greeting = $"Hello, \{name}!";

是什么力量促使 Java 创建者使用

STR.
来代替?

java string-interpolation
1个回答
0
投票

其基本原理由JEP 430提供。它承认字符串插值的便利性,例如a

$
就像你的例子一样,但接着说安全是不这样做的一个重要原因。引用自 JEP

不幸的是,插值的便利性有一个缺点:很容易构建将被其他系统解释的字符串,但在这些系统中却是危险的错误。

最明显的例子就是 SQL 语句中的插值。

JEP 的下一部分,“我们能做得更好吗?”说

对于 Java,我们希望有一个字符串组合功能,既可以实现插值的清晰度,又可以实现开箱即用的更安全的结果,或许可以牺牲少量的便利性来获得大量的安全性。

请注意,字符串模板将在 Java 23 中被删除:https://bugs.openjdk.org/browse/JDK-8329949

© www.soinside.com 2019 - 2024. All rights reserved.