JEP 355:文本块(预览)
概括
_将文本块_添加到 Java 语言中。文本块是多行字符串文字,它不需要大多数转义序列,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。这是JDK 13 中的预览语言功能。
历史
这是JEP 326(原始字符串 文字)中开始的探索的后续工作,该探索已被撤回并且没有出现在 JDK 12 中。
目标
-
通过轻松表达跨越多行源代码的字符串,同时避免常见情况下的转义序列,从而简化 Java 程序的编写任务。
-
增强 Java 程序中表示用非 Java 语言编写的代码的字符串的可读性。
-
通过规定任何新构造都可以将同一组字符串表示为字符串文字,解释相同的转义序列,并像字符串文字一样进行操作,从而支持从字符串文字迁移。
非目标
-
java.lang.String
为任何新构造表达的字符串定义与 不同的新引用类型不是目标。 -
+
定义不同于、接受操作数的新运算符并不是目标String
。 -
文本块不直接支持字符串插值。未来的 JEP 中可能会考虑插值。
-
文本块不支持原始字符串,即不打算对其字符进行任何处理的字符串。
动机
在 Java 中,在字符串文字中嵌入 HTML、XML、SQL 或 JSON 的片段"..."
通常需要在包含该片段的代码编译之前使用转义和连接进行大量编辑。该代码片段通常难以阅读且难以维护。
更一般地说,在 Java 程序中表示短、中、长文本块的需求几乎是普遍的,无论文本是来自其他编程语言的代码、表示黄金文件的结构化文本还是自然语言的消息。一方面,Java 语言通过允许无限大小和内容的字符串来认识到这种需求,但另一方面,它体现了一种设计默认值,即字符串应该足够小以在源文件的单行上表示,并且简单足以轻松逃脱。 Java 语言可以通过接受字符串可能大到足以跨越源文件的多行,并设想其内容中的转义符可以表示格式化和布局操作以及单个字符来进行正则化。
因此,拥有一种比字符串文字更字面地表示字符串的语言机制——跨多行且没有转义的视觉混乱,将提高大量 Java 程序的可读性和可写性。本质上,是二维文本块,而不是一维字符序列。
HTML 示例
使用“一维”字符串文字
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
使用“二维”文本块
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";