概述

  1. Text BlocksJDK 15 正式发布
  2. Text Blocks 是一个由多行文字构成的字符串

丑陋

image-20241203164728422

所见即所得

  1. Text Blocks 是一个由多行文本构成的字符串

  2. Text Blocks 使用新的形式来表达字符串

    • Text Blocks 尝试消除换行符连接符转义字符的影响
    • 使文字对齐必要的占位符更加清晰,简化多行字符串的表达

    image-20241203165944345

  3. 消失的特殊字符 - 换行符(\n)、连接字符(**+**)、双引号没有使用转义字符(\)

  4. Text Blocks 由零个或多个内容字符组成,从开始分隔符开始,到结束分隔符结束

    • 开始分隔符 - """,后跟零个或者多个空格,以及行结束符组成的序列 - 必须单独成行
    • 结束分隔符 - 只有 """ - 之前的字符,包括换行符,都属于 Text Blocks 的有效内容
  5. Text Blocks 至少两行代码,即便只是一个空字符串,结束分隔符也不能和开始分隔符在同一行

  6. Text Blocks 不再需要特殊字符 - 所见即所得

1
2
3
4
5
6
7
8
9
10
$ jshell> String s = """
...> """;
s ==> ""
| created variable s : String

jshell> String s = """""";
| Error:
| illegal text block open delimiter sequence, missing line terminator
| String s = """""";
| ^

编译过程

Text Blocks 是字符串的一种常量表达式,在编译期,Text Blocks 要按顺序通过三个不同的编译步骤

Step Desc
换行符处理 为了降低不同平台换行符的表达差异,编译器把文本内容里的换行符统一转换LF - \u000A
空格处理 删除所有文字内容行结束分隔符共享的前导空格,以及所有文字内容行尾部空格
转义处理 避免开发人员编写的转义序列在前面的步骤被修改删除

Text Blocks 是在编译期处理的,在编译期被转换成常量字符串,然后被当作常规的字符串

image-20241203180004388

Text Blocks 本身是字符串,能够使用字符串支持的各种 API

image-20241203180739105

删除共享前导空格(实现缩进) + 删除尾部空格 - . 为前导空格,而 ! 为尾部空格,都会被删除

1
2
3
4
5
6
7
8
9
// There are 8 leading white spaces in common
String textBlock = """
........<!DOCTYPE html>
........<html>
........ <body>
........ <h1>"Hello World!"</h1>!!!!
........ </body>
........</html>
........""";
1
2
3
4
5
6
7
8
9
// There are 4 leading white spaces in common
String textBlock = """
.... <!DOCTYPE html>
.... <html>
.... <body>
.... <h1>"Hello World!"</h1>!!!!
.... </body>
.... </html>
....""";
1
2
3
4
5
6
7
8
9
// There are 8 leading white spaces in common
String textBlock = """
........<!DOCTYPE html>
........<html>
........ <body>
........ <h1>"Hello World!"</h1>!!!!
........ </body>
........</html>
........!!!!""";

尾部空格 - \s - 空格转义符 - 新引入 - 表示一个空格 - 不会在 Text Blocks 的编译期被删除 - 保留之前的空格

1
2
3
4
5
6
7
8
9
// There are 8 leading white spaces in common
String textBlock = """
........<!DOCTYPE html> \s!!!!
........<html> \s
........ <body>!!!!!!!!!!
........ <h1>"Hello World!"</h1>
........ </body>
........</html>
........""";

长段落

  1. 编码规范一般都限定每一行字节数,通常为 80 / 120 字节,而长段落一般都会超过该限制
  2. Text Blocks 中的换行符需要保留,而编码规范需要遵守
  3. Text Blocks 引入新的转义字符 - 换行转义符
    • 如果换行转义符出现在一个结束位置,该行的换行符会被取缔
  4. 空格处理先于转义字符处理
    • 转义字符之前的空格不算 Text Blocks 的尾部空格,会被保留

image-20241203182541953