0
点赞
收藏
分享

微信扫一扫

【Java语法解析】Java 15中,文本块有哪些优势?

phpworkerman 2022-03-25 阅读 99
java

文章目录


语法话题

本期的语法话题为:


文本块的声明

文本块是Java 15新增的语法特性(Java 13与Java 14作为预览特性,这里我们以正式引入的版本为准),用来声明(表示)String对象。在Java 15之前,String对象使用双引号(单个)来界定,而文本块使用三个双引号来界定,语法格式如下:

// """表示文本块的开始,后面可以接零或多个空白符,然后接一个行终止符。
Sting s = """
此处是文本块的第一行内容。
此处是文本块的第二行内容。
... 更多文本内容。
// """表示文本块的结束。
""";

文本块的优势

我们可能需要在Java程序中定义一些SQL,HTML,JSON等长文本内容,而为了程序的可读性,这些字符串通常是多行显示的。在Java 15之前,需要通过大量的“+”运算符来完成拼接,通过繁琐的“\n”来实现换行,但从Java 15起,就可以通过声明文本块来方便的表示。相对于之前的声明方式,文本块具有如下优势:

  • 文本块中,行终止符无需使用转义,这样我们就可以声明多行的String对象,从而提高程序的可读性。
  • 文本块中,用于界定字符串常量的双引号,可以直接出现,无需转义。
package test;

public class Test {
	public static void main(String[] args) {
		// Java 15之前的声明方式。
 		// 需要控制双引号与换行的转义,非常繁琐。
		String html = "<p class=\"cn\">\n\t<a href=\"a.html\">\n\t\t点击\n\t</a>\n</p>";
		// 为了程序的可读性,可以使用+来拼接,但操作依然不便,改善有限。
		String html2 = "<p class=\"cn\">" 
				+ "\n\t<a href=\"a.html\">"
				+ "\n\t\t点击\n\t"
				+ "</a>\n</p>";
		// Java 15(或以后)的声明方式。
		// String对象可以跨行编写,无需使用+拼接,也无需对双引号转义。
		String html3 = """
				<p class="cn">
					<a href="a.html">
						点击
					</a>
				</p>""";
		System.out.println(html);
		System.out.println(html3);
		System.out.println(html == html3);
	}
}

程序运行结果如下:

<p class="cn">
	<a href="a.html">
		点击
	</a>
</p>
<p class="cn">
	<a href="a.html">
		点击
	</a>
</p>
true

从运行结果可知,两种声明方式是等价的,但明显使用文本块的方式更加简洁。


空白的处理

简单来说,文本块会计算相对缩进的位置(字符数量),然后基于该位置,将所有行向左缩进(平移),行尾删除所有空白字符。当然,这里面有更细致的处理规则,我们会在《【Java语法解析】文本块是怎样处理空白的?》中讲解。


转义的特例

在文本块中,双引号与行终止符可以直接出现,无需转义。不过,有一种特例情况,就是当文本块内容中出现连续三个双引号的时候,编译器会将其解析为文本块的终止界定,此时,就需要至少将其中一个双引号进行转义,按照惯例,我们将第一个双引号转义。

package test;

public class Test {
	public static void main(String[] args) {
		String s = """
				文本块中,使用三个双引号\"""作为界定。
					""";
	}
}

续行符

续行符是在Java 15中新增的一种转义序列,表示方式如下:

\行终止符

有时候,文本块中可能会出现较长的文本,为了程序的可读性,我们会将其分成多行编写。但是,在输出该String对象时,文本内容也会换行显示。如果我们不希望其换行,就可以使用续行符来实现。

package test;

public class Test {
	public static void main(String[] args) {
		// \与后面的行终止符为续行符的转义(不换行)。
		String s = """
				对于文本块中的内容,如果不希望其换行显示,\
				就可以使用续行符来实现。
				""";
		System.out.println(s);
	}
}

程序运行结果如下:

对于文本块中的内容,如果不希望其换行显示,就可以使用续行符来实现。

文本块的格式化

之前我们声明的文本块,其内容都是在编译期间(我们编写代码时)就已经完全确定,这在实际开发中是很少见的。在真实场景中,我们通常都是根据用户的操作(例如输入或者下拉列表选项等)来生成相应的数据,然而用户怎样操作,我们在编译期间是不可能未卜先知的,此时,文本框是否也要沦落到使用“+”拼接的境地呢?

例如,我们根据用户的输入,来动态生成链接显示的文本内容。

package test;

public class Test {
	// 根据传递的参数,设置链接文本。
	public String getHTML(String linkText) {
		String html = """
				<p class="cn">
					<a href="a.html">
				""" + linkText + """
					</a>
				</p>""";
		return html;
	}
	
	public static void main(String[] args) {
		System.out.println(new Test().getHTML("点击此处查看详情"));
	}
}

我们可以看到,这样的拼接是相当繁琐的,而且因为我们没有调整多个文本块与String变量(linkText)之间的缩进,程序的输出结果也并不友好:

<p class="cn">
	<a href="a.html">
点击此处查看详情	</a>
</p>

如此一来,使用文本块就没有任何优势了。不过,幸运的是,我们可以通过String类提供的formatted方法来解决这个问题。

package test;

public class Test {
	// 根据传递的参数,设置链接文本。
	public String getHTML(String linkText) {
		String html = """
				<p class="cn">
					<a href="a.html">
						%s
					</a>
				</p>""";
		// 使用linkText替换掉html中的占位符,即%s。
		return html.formatted(linkText);
	}

	public static void main(String[] args) {
		System.out.println(new Test().getHTML("点击此处查看详情"));
	}
}

通过String类的formatted方法,就可以轻松使用变量来完成文本块的替换,非常方便。这次,我们也能够得到期望的结果。程序运行结果如下:

<p class="cn">
	<a href="a.html">
		点击此处查看详情
	</a>
</p>
举报

相关推荐

0 条评论