Java Feature Spotlight:文本块

2020-05-02 18:05:25

JavaSE13(2019年9月)引入了文本块作为预览特性,旨在减少在Java中声明和使用多行字符串文字的痛苦。随后在第二个预览版中对其进行了改进,做了一些细微的修改,并计划在JavaSE15中成为Java语言的永久特性(2020年9月)。

Java程序中的字符串文字并不局限于像";yes";和";no";这样的短字符串;它们通常对应于HTML、SQL、XML、JSON甚至Java等结构化语言中的整个程序。

文本块是可以包含多行文本的字符串文字,并使用三引号(";";";)作为其开始和结束分隔符。

文本块可以被认为是嵌入在Java程序中的二维文本块。

能够保留嵌入式程序的二维结构,而不必使用转义字符和其他语言干扰,更不容易出错,从而产生更具可读性的程序。

在纽约QCon的Java Futures中,Java语言架构师Brian Goetz带我们进行了一次旋风式的Java语言特性之旅。在本文中,他深入研究文本块。

JavaSE13(2019年9月)引入了文本块作为预览特性,旨在减少在Java中声明和使用多行字符串文字的痛苦。

随后在第二个预览版中对其进行了改进,做了一些细微的修改,并计划在JavaSE15中成为Java语言的永久特性(2020年9月)。

文本块是可以包含多行文本的字符串文字。文本块如下所示:

在这个简单的示例中,变量ADDRESS将包含一个两行字符串,每行后面都有行终止符。如果没有文本块,我们将不得不编写:

字符串地址=";25 Main Street\n";+";美国Anytown,12345\n";或字符串地址=";25 Main Street\n,美国Anytown,12345\n";;

正如每个Java开发人员都知道的那样,这些替代方案编写起来很麻烦。但是,更重要的是,它们也更容易出错(很容易忘记并没有意识到这一点),也更难阅读(因为语言语法与字符串的内容混在一起)。因为文本块通常没有转义字符和其他语言中断,所以它让语言避开了障碍,所以读者更容易看到文本块中的内容。

字符串文字中最常见的转义字符是换行符(\n),文本块允许直接表示多行字符串,因此不再需要换行符。换行符之后,下一个最常见的转义字符是双引号(\";),必须对其进行转义,因为它与字符串文字分隔符冲突。文本块也不需要这些,因为单引号与三引号文本块分隔符不冲突。

有人可能会认为这个特性会被称为多行字符串文字(很多人可能会这么称呼它)。但是,我们选择了一个不同的名称,文本块,以强调这样一个事实,即文本块不仅仅是不相关的行的集合,而是更好地被认为是嵌入在Java程序中的二维文本块。为了说明我们所说的二维是什么意思,让我们再来看一看。

作者希望这篇文章能打印出什么内容呢?虽然我们无法读懂他们的想法,但似乎不太可能是想让XML块缩进21个空格;这21个空格更有可能仅仅是为了将文本块与周围的代码对齐。另一方面,几乎可以肯定的是,作者的意图是输出的第二行应该比第一行多缩进四个空格。此外,即使作者确实想要.。

从这个例子中,我们可以看到,程序源代码中嵌入的多行文本块的块的自然缩进既来自于块的各行之间所需的相对缩进,也来自于块与周围代码之间的相对缩进。我们希望字符串字面值与代码对齐(因为如果它们不对齐,它们会看起来不合适),并且我们希望字符串字面值的行反映相对缩进……。

解决这个问题的一种方法是使用库方法,我们可以将其应用于多行字符串文字,例如Kotlin的trimIndent方法,而Java确实提供了这样的方法:string::stripIndent。但由于这是一个非常常见的问题,Java走得更远,在编译时自动去除附带的缩进。

为了理清附带的和必要的缩进,我们可以想象在包含整个代码段的XML代码段周围绘制尽可能小的矩形,并将该矩形的内容视为二维文本块。这是魔术