Java Feature - Text Blocks
概述
- Text Blocks 在 JDK 15 正式发布
- Text Blocks 是一个由多行文字构成的字符串
丑陋
所见即所得
Text Blocks 是一个由多行文本构成的字符串
Text Blocks 使用新的形式来表达字符串
- Text Blocks 尝试消除换行符、连接符、转义字符的影响
- 使文字对齐和必要的占位符更加清晰,简化多行字符串的表达
消失的特殊字符 - 换行符(\n)、连接字符(**+**)、双引号没有使用转义字符(\)
Text Blocks 由零个或多个内容字符组成,从开始分隔符开始,到结束分隔符结束
- 开始分隔符 -
"""
,后跟零个或者多个空格,以及行结束符组成的序列 - 必须单独成行 - 结束分隔符 - 只有
"""
- 之前的字符,包括换行符,都属于 Text Blocks 的有效内容
- 开始分隔符 -
Text Blocks 至少两行代码,即便只是一个空字符串,结束分隔符也不能和开始分隔符在同一行
Text Blocks 不再需要特殊字符 - 所见即所得
1 | $ jshell> String s = """ |
编译过程
Text Blocks 是字符串的一种常量表达式,在编译期,Text Blocks 要按顺序通过三个不同的编译步骤
Step | Desc |
---|---|
换行符处理 | 为了降低不同平台间换行符的表达差异,编译器把文本内容里的换行符统一转换成 LF - \u000A |
空格处理 | 删除所有文字内容行和结束分隔符共享的前导空格,以及所有文字内容行的尾部空格 |
转义处理 | 避免开发人员编写的转义序列在前面的步骤被修改或删除 |
Text Blocks 是在编译期处理的,在编译期被转换成常量字符串,然后被当作常规的字符串
Text Blocks 本身是字符串,能够使用字符串支持的各种 API
删除共享的前导空格(实现缩进) + 删除尾部空格 -
.
为前导空格,而!
为尾部空格,都会被删除
1 | // There are 8 leading white spaces in common |
1 | // There are 4 leading white spaces in common |
1 | // There are 8 leading white spaces in common |
尾部空格 -
\s
- 空格转义符 - 新引入 - 表示一个空格 - 不会在 Text Blocks 的编译期被删除 - 保留之前的空格
1 | // There are 8 leading white spaces in common |
长段落
- 编码规范一般都限定每一行的字节数,通常为 80 / 120 字节,而长段落一般都会超过该限制
- Text Blocks 中的换行符需要保留,而编码规范需要遵守
- Text Blocks 引入新的转义字符 - 换行转义符
- 如果换行转义符出现在一个行的结束位置,该行的换行符会被取缔
- 空格处理先于转义字符处理
- 转义字符之前的空格不算 Text Blocks 的尾部空格,会被保留
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.