问题描述
Java 15 introduced(非预览版)文本块功能。 通过从行中删除 常见空白前缀 ,它可以定义多行字符串文字而不会破坏代码缩进。该算法在JEP 378中进行了描述。
但是,如果使用制表符和空格混合来缩进行,那么“公共空白前缀”的定义是如何呢?
例如,在以下情况下,字符串值是什么(<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
表示空格,·
表示制表符):
→ → ····String text = """ → → ····→ line1 → ········→ line2 → ····→ → """;
使用OpenJDK进行的简单测试显示结果字符串为:
line1 ··→ line2
因此,看来Javac只是对空格符号(包括空格和制表符)进行计数,并使用该计数-相等地对待空格(0x20)和制表符(0x09)。这是预期的行为吗?
旁注:这不是一个纯粹的理论问题;对于混合空格/制表符缩进和大型代码库的项目,它具有实际的重要性。
解决方法
我找到了想要分享的答案。
Java编译器确实确实平等地对待空格,制表符和所有其他whitespace characters 。
因此,从每一行中删除了(任意)空白字符相同的金额。
详细信息:
javac
tokenizer使用String.stripIndent()
method,它具有以下实现说明:
此方法将所有空白字符视为宽度相等。 只要每行的缩进始终由相同的字符序列组成 ,则结果将如上所述。