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 创建者转而使用 Java STR.

2

  • 4
    诸如“开发人员为什么要做 X?”之类的问题不适合 SO,因为它们只能吸引固执己见的答案,因此不负责任。这样的问题最好针对开发者本身,因为我们不知道他们为什么做出这个决定。


    – 

  • 2
    通常我会同意上述观点,但 Java 增强过程 (JEP) 是记录此类内容的地方。请参阅


    – 


1 个回答
1

提供了基本原理。它承认字符串插值的便利性,例如$在您的示例中,但接着说安全性是不进行插值的一个重要原因。引用 JEP 的内容:

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

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

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

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

请注意,字符串模板是Java 21 和 22 中的),并将在 Java 23 中删除:

10

  • 谢谢你!反引号呢?


    – 

  • 1
    同样,这是插值的另一种形式,JEP 给出了来自不同语言的几个示例。模板的工作方式不同 – 请阅读 JEP 了解详细信息。


    – 

  • 1
    @Powet 那他们呢? JEP430 的中心论点是:“将用户提供的(即可能有害的)数据推入字符串会导致大量安全漏洞,除非应用某种卫生措施;必须应用的卫生措施取决于无法从字符串中收集的上下文因此,源文件中的任何字符串插值构造都必须包含有关使其安全所需的信息。换句话说,引号不提供任何添加此参数的机会。


    – 

  • 1
    @Powet 一个常见的主题是“但其他语言是这样做的”,这不是一个影响 OpenJDK 的论点,也不应该成为一个影响你的论点。谁在乎大多数其他语言冲下悬崖并消亡呢?这并不是一个让他跳下悬崖的合理理由。问题STR在于STR."template here"“应该采取什么卫生措施?”范围。当然,您可以用反引号替换引号,但STR如果不让 kersplat 掉下悬崖,您就无法摆脱引号。


    – 

  • 1
    @Powet 请注意,您在问题中描述的内容是旧闻。该提案在被完全撤回之前的最后状态(正如 ndc85430 所写,它现在已被撤回。我很失望,该提案太棒了)是字符串模板看起来像$"foo.\{whatever}"并且生成字符串。你必须将它们提供给一个用它来做某事的方法。这“选择”了卫生。例如escapers.html("Hello, <em>\{username}</em>")


    –