JavaのString.formatを読む
JavaのString.formatはどうやって書式文字列をパースしているのか調べる
OpenJDKのソースがGitHubから見られるようなので、見てみる
現在(2023/10/30)のmasterでは、String.formatの実装箇所はここ
実装の本体はjava.util.Formatterにあるようなので、そちらを見ていく
まずはコンストラクタ
StringBuilderはAppendableを実装しているようなので、実際に呼び出されているコンストラクタはこちら
次に、Formatter#formatが呼び出されている
ここで呼び出されているオーバーライドが本体っぽいので、この中を見ていく
ensureOpen
はAppendableがnullなら例外を投げる検査用のメソッド
parse
はフォーマット文字列をパースして引数をフォーマットするようなオブジェクトを返してくれていそうだ
以降の処理ではこのオブジェクト1つごとに引数を対応づけて、最終的な文字列を作り出していると思われる
さきにparse
の中を見てみる
フォーマット文字列を1文字づつ見ていってFormatStringオブジェクトをListに追加していく処理のようだ
フォーマット文字列から'%'
を探して、見つからなければ、ここが引数を取らない末尾の部分
文字列全体をFixedStringとしているようなので、FixedStringはフォーマットの引数を取らないFormatStringのインスタンス
今見ている文字列が'%'
でなければ、'%'
が見つかった前までの部分はフォーマットの引数を取らない文字列
以降は'%'
の次の文字から見ていく
末尾が'%'
だと、書式指定子が取れないので、UnknownFormatConversionException
を投げている