8

刚刚遇到了 Java 15 中的一个新特性,即“文本块”。我可以假设可以通过连接“+”运算符在文本块中添加变量,如下所示:

String html = """
          <html>
              <body>
                  <p>Hello, """+strA+"""</p>
              </body>
          </html>
          """;

但是他们是否提供了任何方式,以便我们可以添加变量,这种方式在许多其他语言中变得流行,如下所示:

String html = """
          <html>
              <body>
                  <p>Hello, ${strA}</p>
              </body>
          </html>
          """;

这个问题可能听起来很傻,但在某些情况下可能很有用。

4

4 回答 4

16

Java 15 不支持直接在文本块内进行插值,也不支持纯字符串文字。

Java 15 中的解决方案是使用String.formatted()方法

String html = """
      <html>
          <body>
              <p>Hello, %s</p>
          </body>
      </html>
      """.formatted(strA);
于 2020-09-07T09:22:42.887 回答
4

来自文本块的规范

文本块不直接支持字符串插值。在未来的 JEP 中可能会考虑插值。

“字符串插值”的含义

评估包含一个或多个占位符的字符串文字,产生占位符替换为其对应值的结果

来自维基百科


如上所述,也许我们将来会得到它。尽管很难说他们如何在不破坏向后兼容性的情况下实现这一点——${}例如,如果我的字符串包含 会发生什么?Java 语言设计者很少添加任何可能破坏向后兼容性的内容。

在我看来,他们最好要么立即支持它,要么永远不支持它。

也许使用一种新的文本块是可能的。"""例如,它们可以'''用来表示参数化文本块,而不是分隔符。

于 2020-09-01T12:26:27.710 回答
0

正如已经讨论过的,这在 JDK15 中是不可能的,您无法改变这一事实。

但是,我想您正试图用 C# 语言提出这样的建议。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

虽然这只是string.Format()C# 中方法的语法糖(它是 Java 中的对应物String.format()),但如果我们可以在 Java 中拥有它显然很好。这是对现有语言语法中描述字符串文字方式的扩展,当然这也可以很容易地适应文本块规范。

如果这是您的想法,您可以向Java Community Process提出建议以扩展 Java 语言规范。这比在 Java 编译器/运行时规范中添加功能齐全的模板引擎要轻得多的语法/语义增强,并且他们可能会同意您的看法。

于 2020-09-02T06:18:48.990 回答
-1

正如用户@Michael 提到的那样:不。'他们'(团队 Project Amber,他们正在实施 JEP 368)没有提供任何方法来插入文本块中的字符串。

请注意,我有点怀疑它是否会发生。首先,存在向后兼容性问题;任何引入插值的尝试都需要一些标记,以便任何现有的文本块不会突然改变其含义,具体取决于javac调用的版本。

但更重要的是,您自己提出这个问题,甚至无法提出一个有效的例子,这可能表明这个功能没有听起来那么有用。看起来您想出了一个有效的用例,但实际上并非如此:如果您编写的内容可以编译并工作,那么您只是编写了一个带有相当严重的 XSS 安全漏洞的 web 应用程序!

关键是,您真正想要的是“模板化”,而模板化听起来很简单(只需评估此表达式,然后将结果推入我输入表达式的字符串中!) - 它不是。逃避是一个很大的原因。但是你不能一概而论地应用${strA}在文本块中表示的规则:评估表达式strA然后 HTML 转义那个,然后把它放进去,原因有两个:谁说你插入的字符串是 HTML 而不是,比如说,JSON 或 TOML 或 CSV 或诸如此类,谁说我想要的插值首先需要转义?如果我想动态注入<em>与否,又不想变成这样怎么办&lt;em&gt;

要么我们更新 langspec 以迎合所有这些情况,现在我们正在发明一个完整的模板系统并将其推入一个似乎更适合专用库的工作的 lang 规范中,或者我们不这样做,并且功能看起来很有用,但实际上是利基市场:要么你很少使用它,要么你的代码库中到处都有安全和其他错误 - 任何会引起滥用的语言特性都是,我希望有人会同意我的观点 - 不是一个很棒的功能。

是的,许多语言都有这一点,但目前决定哪些 Java 语言特性使其成为该语言的未来版本的人似乎处于他们承认这些特性存在并将从中吸取教训的阶段,但不会将特性添加到 java '只是因为所有这些其他语言都有它' - 总是首先考虑一些想法和用例,并且任何对字符串文字插值的此类分析可能会导致:“嗯,可能不值得对语言进行添加”。

于 2020-09-01T12:36:59.517 回答