文本块(Text Blocks)#
版本信息
- 最低 JDK:15(13/14 预览 → 15 正式,17 LTS GA)
- JEP:JEP 378
为什么需要#
JDK 8 里写多行字符串(JSON、SQL、HTML)要用一堆 + 拼接和 \n,既丑又易错。文本块用三引号 """ 直接写多行,保留换行,无需转义。
语法#
package com.javamodern.textblock;
public class TextBlockDemo {
public static void main(String[] args) {
String json = """
{
"name": "Java",
"version": 17
}
"""; // (1)
System.out.println(json);
}
static String html() {
return """
<html>
<body>Hello</body>
</html>
""";
}
}
- :material-lightbulb: 结尾
"""所在列决定公共前导空白被剥离多少——这里与内容同列,故剥离后无前导空格。(开头"""后必须换行,见下方「常见坑」。)
与 JDK 8 旧写法对比#
String json = "{\n" +
" \"name\": \"Java\",\n" +
" \"version\": 17\n" +
"}";
String json = """
{
"name": "Java",
"version": 17
}
""";
底层原理#
文本块是 String 的语法糖:编译期确定内容,剥离偶然缩进(以结尾 """ 为基准的最短缩进),并处理行终止符统一为 \n。运行时就是一个普通 String,无额外类型。
graph LR
T["源码文本块"] --> S["剥离偶然缩进"]
S --> L["行终止符统一为 \\n"]
L --> R["运行时即 String"]
style T fill:#bbdefb
常见坑 / 最佳实践#
- 开头
"""后必须紧跟换行,否则编译错误。 - 需要保留尾部空格时用
\s(escape 序列);需要换行可控时用\(行尾续行,取消换行)。 - 结尾
"""的位置控制缩进剥离,对齐错了会多/少前导空格。
小结#
文本块让多行字面量可读、免转义,是写 SQL/JSON/HTML 模板的利器。