文本块是什么?使用时有哪些注意事项?
- 标签:Java、新特性
🏛 业务架构师
文本块(Text Blocks,JDK 15 转正):三引号 """ 定义多行字符串,保留排版结构——
java
String prompt = """
你是客服助手,规则:
1. 仅依据资料回答
2. 不确定就转人工
""";使用注意事项:
- 缩进管理是核心规则:最小缩进基准由"结束定界符的位置"(或最靠左的内容行)决定——内容统一向左剥离这个基准缩进;想保留额外缩进,把结束
"""往左放或用\s显式空格; - 行尾空格会被剥离:需要保留用
\s转义; - 换行控制:文本块内换行是真实的
\n;单行太长想拼接时用行尾\(续行)或行首\<换行>(并入上一行); - 转义仍然可用:
\"、\\、\n都有效,三引号本身用\"\"\"转义; - 不是原始字符串:文本块处理转义,与有些语言的 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"
}
""";注意事项(踩过坑的清单):
- 缩进剥离规则:公共最小缩进(所有非空行 + 结束分隔符的公共前缀)被剥离——结束
"""的位置决定保留多少缩进:想保留一层缩进就把闭合引号往左移,这是最反直觉的点; - 行尾反斜杠续行(拼接长行)、
\s(保留行尾空格)两个转义实用:
java
String sql = """
SELECT id, name \
FROM users \
WHERE status = 'A'"""; // 渲染成单行- 不支持插值(设计决定)——用
STR."..."模板(JDK 21 preview,25 的 StringTemplate 已撤回重做)或formatted():
java
String q = """
SELECT * FROM users WHERE id = %d""".formatted(id);- 换行是
\n——写 Windows 文件要自己处理;文本块里可以用"但不能直接出现""";首位换行("""后立即换行)会被忽略,不换行则内容从当行开始(易错)。
实践:把 SQL、提示词模板(喂 LLM 的 prompt!)、Dockerfile 片段全迁到文本块+.formatted(),可读性质变;注意 .formatted() 的 % 与内容里的 %s 冲突(SQL 的 LIKE '%x%' 要转义成 %%)。