Java 中的三重引号,如 Scala

Triple quotes in Java like Scala

在 Scala 中你可以这样做:

val expr = """ This is a "string" with "quotes" in it! """

Java里有这样的东西吗?我讨厌使用 "\"" 来表示带有引号的字符串。尤其是在 JSON 中组合 key/value 对时。恶心!

除了使用 \" 在字符串文字中包含双引号外,没有其他好的选择。

有不好的选择:

  • 使用 \u0022,双引号字符的 Unicode 转义。编译器将 Unicode 转义视为键入该字符。它在 源代码 、ending/beginning 和 String 文字中被视为双引号字符,因此这不起作用。
  • 连接字符 '"',例如"This is a " + '"' + "string"。这会起作用,但它似乎比仅使用 \".
  • 更丑陋且可读性更差
  • 连接 char 34 表示双引号字符,例如"This is a " + (char) 34 + "string"。这会起作用,但是您试图在字符串中放置一个双引号字符就更不明显了。
  • 复制并粘贴 Word 的 "smart quotes",例如"This is a “string” with “quotes” in it!"。这些不是相同的字符(Unicode U+201C 和 U+201D);它们有不同的外观,但它们会起作用。

我想隐藏 "disgusting"-ness,你可以将它隐藏在常量后面。

public static final String DOUBLE_QUOTE = "\"";

那么你可以使用:

String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;

它比其他选项更具可读性,但它仍然不是很可读,而且仍然很难看。

Java中没有"""机制,所以使用转义\"是最好的选择。它是最易读的,也是最不丑陋的。

在做同样的事情时发现了这个问题:composing small literal JSON strings for quick testing。一种没有出现的替代方法是使用双单引号并将它们替换为双引号,例如:

String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")

显然,如果存在常规的双单引号,这将不起作用,但这种可能性很小。这不是一个很好的解决方案,但看起来比很多反斜杠要好,imo。作为将 json 放入单独文件的中间步骤,这可能还不错。

Since Java 13 preview feature

REF:https://openjdk.java.net/jeps/355

它并不完全以 Scala 方式工作。开头的三重引号 必须 后跟一个新行。

var expr = """
           This is a 1-line "string" with "quotes" and no leading spaces in it! """;

结束三重引号的位置很重要。它定义缩进大小。例如,要缩进 2 个空格,您可以按如下方式放置结束 """

String sql = """
               SELECT   emp_id, last_name
               FROM     postgres.employee
               WHERE    city = 'INDIANAPOLIS'
               ORDER BY emp_id, last_name;
             """;

这将产生 4 行文本:

  SELECT   emp_id, last_name
  FROM     postgres.employee
  WHERE    city = 'INDIANAPOLIS'
  ORDER BY emp_id, last_name;

转义:

三重引号转义很直观:

String txt = """
    A text block with three quotes \""" inside.""";

注意:此功能是预览版,因此您不能在Java13中使用它,除非您设置--enable-preview TextBlock键。

更新: 该功能转到 the second preview (JEP 368) 和 Java 14.

将等待 Java 15.

"Raw String Literals" 的功能原本应该在 Java 12 中,但由于一些批评而被 withdrawn,因为他们计划使用可变数量的反引号 (`).

所以它在 Java 13 最后,作为 "Text Block" 功能,但仅在 preview 中。它像 Scala 一样使用 """ 运算符。

您可以阅读更多关于 Java 13 项功能 here