Java文本块:缩进前缀中的制表符和空格的混合

问题描述

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,它具有以下实现说明:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...