5

Java 15引入了(非预览版)文本块功能。它允许通过从行中去除公共空白前缀来定义多行字符串文字而不破坏代码缩进JEP 378中描述了该算法。

但是,在使用制表符和空格混合缩进的情况下,“通用空白前缀”究竟是如何定义的?

例如,以下情况下的字符串值是什么(·表示空格,表示制表符):

→ → ····字符串文本 = """
→ → ····→ 1号线
→········→ line2
→····→→“””;

使用 OpenJDK 进行的简单测试显示结果字符串为:

第1行
··→线2

所以看起来 Javac 只计算空白符号,包括空格和制表符,并使用计数——平等地对待空格 (0x20) 和制表符 (0x09)。这是预期的行为吗?


旁注:这不是一个纯粹的理论问题;它对于具有混合空格/制表符缩进和大型代码库的项目具有实际重要性。

4

1 回答 1

8

我找到了我想分享的答案。

Java 编译器确实平等地对待空格、制表符和所有其他空白字符

因此,从每一行中删除了相同数量的(任何)空白字符。


细节:

javactokenizer使用String.stripIndent()方法,该方法具有以下实现说明:

此方法将所有空白字符视为具有相等的宽度。只要每一行的缩进都是由相同的字符序列组成的,那么结果将如上所述。

于 2020-11-03T14:02:18.223 回答