Apache Xerces SVNリポジトリでリビジョン318617への変更を追跡しました(これは、パッケージ名が示すように、このXMLパーサーが最初に開発されたプロジェクトです)。
コミットメッセージの関連部分は次のとおりです。
シンボルテーブルの使用を改善しようとしています。パーサーがリセットされるたびに、多くの事前定義された文字列がシンボルテーブルに追加されます。小さなドキュメントの場合、これはかなりのコストになります。シンボルテーブルの文字列に対してString#internを呼び出すので、これらの事前定義されたシンボルに対してString#internを使用するだけで十分です。これは一度だけ実行する必要があります。
お気づきのように、準拠しているJVM実装では、は.intern()
必要ではありません(そして目に見える影響はありません)。
私の推測では
- どちらの作者も、文字列リテラルが常にインターンされるという事実に気づいていませんでした
- または、JVMの実装の誤動作を防ぐための意識的な決定でした
ただし、2番目のケースでは、コメントまたはコメントメッセージにそのメモが含まれていると思います。
.intern()
この呼び出しの副作用の1つは、初期化子が定数式ではなくなり、フィールドがそれらを参照する他のクラスによってインライン化されないことです。これにより、クラスXMLScanner
がロードされ、そのフィールドが読み取られます。ただし、これはここでは関係ないと思います。