Skip to content

文本块是什么?使用时有哪些注意事项? ​

  • 标签:Java、新特性

🏛 业务架构师 ​

文本块(Text Blocks,JDK 15 转正):三引号 """ 定义多行字符串,保留排版结构——

java
String prompt = """
        你是客服助手,规则:
        1. 仅依据资料回答
        2. 不确定就转人工
        """;

使用注意事项:

  1. 缩进管理是核心规则:最小缩进基准由"结束定界符的位置"(或最靠左的内容行)决定——内容统一向左剥离这个基准缩进;想保留额外缩进,把结束 """ 往左放或用 \s 显式空格;
  2. 行尾空格会被剥离:需要保留用 \s 转义;
  3. 换行控制:文本块内换行是真实的 \n;单行太长想拼接时用行尾 \(续行)或行首 \<换行>(并入上一行);
  4. 转义仍然可用:\"、\\、\n 都有效,三引号本身用 \"\"\" 转义;
  5. 不是原始字符串:文本块处理转义,与有些语言的 raw string 不同,别混淆。

业务价值(2026 年特别应景):LLM 应用的提示词是典型的大段多行文本——传统 "..." + "\n" + "..." 的拼串写法既难读又易错,提示词改一个字都要数字符;文本块让 Java 代码里的 Prompt 与文档里看到的完全一致,直接复制粘贴调优——Spring AI/LangChain4j 里的提示词模板、JSON 样例、SQL 片段、Dockerfile 命令构造,全面受益。一行判断:凡是代码里出现三行以上字符串拼装,就该用文本块,这是零风险、纯收益的语言特性。

🏗 系统架构师 ​

文本块(Text Blocks,JDK 15)= 三引号多行字符串字面量:

java
String json = """
        {
          "name": "order-service",
          "replicas": 3
        }
        """;

使用注意事项(我踩过的坑清单):

  • 缩进控制(最小缩进规则):行的公共前导空白(含结束 """ 的缩进)会被剥除——结束定界符的位置决定"左边界";要保留额外缩进就少缩进结尾或用 \s(行尾空格保留);
  • 尾部空白默认删除:行尾空格被剥——需要时用 \s 转义显式保留(diff/对齐敏感的场景如 SQL、ASCII 表格);
  • 不能省略行尾换行:最后内容行后仍要换行才到 """(除非 JDK 21+ 的可选 \ 续接行为);
  • 转义仍生效:\n \" 可用;新版增强:\ 行尾续行(拼接不断行)、\s 空格保留;
  • 适用边界:静态模板(SQL、JSON 样例、HTML、提示词模板、日志多行块)最适合;动态拼接复杂 JSON 仍应该用构建器/序列化库——文本块里的 ${} 式插值要靠 formatted() 或模板 API(JDK 21 预览的 String Templates 已在后续版本移回 incubator,谨慎依赖)。

架构实践:测试 fixture、SQL 脚本、Prompt 模板(LLM 应用大量多行模板)、Dockerfile/K8s manifest 内嵌——文本块把这类代码的可读性从"转义地狱"救回来。规范上建议:文本块内容第一行换行(""" 后直接换行,避免内容与定界符同行的歧义)。

💻 全栈开发专家 ​

文本块(Text Blocks,JDK 15 正式):三引号多行字符串,保留换行、自动管理缩进——SQL/JSON/HTML/YAML 内嵌的场景神器。

java
String json = """
        {
          "name": "ken",
          "role": "admin"
        }
        """;

注意事项(踩过坑的清单):

  1. 缩进剥离规则:公共最小缩进(所有非空行 + 结束分隔符的公共前缀)被剥离——结束 """ 的位置决定保留多少缩进:想保留一层缩进就把闭合引号往左移,这是最反直觉的点;
  2. 行尾反斜杠续行(拼接长行)、\s(保留行尾空格)两个转义实用:
java
String sql = """
    SELECT id, name \
           FROM users \
    WHERE status = 'A'""";          // 渲染成单行
  1. 不支持插值(设计决定)——用 STR."..." 模板(JDK 21 preview,25 的 StringTemplate 已撤回重做)或 formatted():
java
String q = """
    SELECT * FROM users WHERE id = %d""".formatted(id);
  1. 换行是 \n——写 Windows 文件要自己处理;文本块里可以用 " 但不能直接出现 """;首位换行(""" 后立即换行)会被忽略,不换行则内容从当行开始(易错)。

实践:把 SQL、提示词模板(喂 LLM 的 prompt!)、Dockerfile 片段全迁到文本块+.formatted(),可读性质变;注意 .formatted() 的 % 与内容里的 %s 冲突(SQL 的 LIKE '%x%' 要转义成 %%)。