5

Java 15で導入された(非プレビュー) テキスト ブロック機能。行から共通の空白プレフィックスを削除することにより、コードのインデントを壊さずに複数行の文字列リテラルを定義できます。アルゴリズムはJEP 378で説明されています。

しかし、タブとスペースの組み合わせを使用して行がインデントされている場合、「共通の空白プレフィックス」はどのように正確に定義されていますか?

たとえば、次の場合 (·はスペース、タブ文字を意味します)の場合、文字列値はどうなりますか?

→ → ····文字列 text = """
→ → ····→ line1
→ ········→ line2
→ ····→ → """;

OpenJDK を使用した簡単なテストでは、結果の文字列は次のようになります。

ライン1
・・・→ line2

したがって、Javac はスペースやタブを含む空白記号をカウントし、そのカウントを使用するように見えます — スペース (0x20) とタブ (0x09) を同等に扱います。これは予想される動作ですか?


補足: これは純粋に理論的な問題ではありません。スペース/タブが混在するインデントと大きなコードベースを持つプロジェクトにとって実用的に重要です。

4

1 に答える 1

8

共有したい答えを見つけました。

実際、Java コンパイラは、スペース、タブ、およびその他すべての空白文字 を同等に扱います。

したがって、同じの (任意の) 空白文字がすべての行から削除されます。


詳細:

javactokenizerString.stripIndent()methodを使用します。これには、次の実装メモがあります。

このメソッドは、すべての空白文字を同じ幅として扱います。すべての行のインデントが一貫して同じ文字シーケンスで構成されている限り、結果は上記のようになります。

于 2020-11-03T14:02:18.223 に答える