跳转至

文本块(Text Blocks)#

版本信息

  • 最低 JDK:15(13/14 预览 → 15 正式,17 LTS GA)
  • JEPJEP 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>
                """;
    }
}
  1. :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 模板的利器。

参考#