Javaで、文字列内に文字列変数を挿入する方法

こんにちは。 エキサイト株式会社の三浦です。

本記事は、エキサイトホールディングス Advent Calendar 2023の4日目のものになります。

qiita.com

良ければ他の記事もどうぞ!

さて、コーディングをしていると、文字列の中に変数で定義してある文字列を挿入したい場合があります。

今回は、Javaで変数挿入を行う方法を3つ紹介します。

1. + を使った連結

最も直感的なのは、 + を使った連結でしょう。

String variable = "world";

String text = "Hello " + variable + "!";

System.out.println(text);

結果

Hello world!

方法自体はシンプルで非常にわかりやすいですが、挿入したい変数が多くなればなるほど式が複雑になってしまいます。

2. String.format を使う方法

String.format を使うこともできます。

String variable = "world";

String text = String.format("Hello %s!", variable);

System.out.println(text);

結果

Hello world!

%s などを文字列の中に入れておき、第2引数以降に渡した変数の内容に置換する」というこの方法は他の言語でもよく見られる方法であり、見慣れている方も多いのではないでしょうか。

一方で、 複数の変数を挿入したい場合は、たくさんの %s 等が文字列の中に並ぶことになるため、どこにどの変数が置換されることになるのか分かりづらくなってしまうこともあります。

なおJava15以降であれば、文字列に直接 .formatted を使うことで同じことができます。

String variable = "world";

String text = "Hello %s!".formatted(variable);

System.out.println(text);

結果

Hello world!

docs.oracle.com

3. 独自の文字列で置換する方法

上記とは別に、独自の文字列で置換する方法もあります。

String variable = "world";

String text = "Hello {world}!".replace("{world}", variable);

System.out.println(text);

結果

Hello world!

{world} など独自のわかりやすい単語を文字列の中に入れておき、あとから replace を使って置換する方法です。

置換するための単語を適切に設定しておけば、どこにどの変数が置換されるかがわかりやすく、その意味では2番目の String.format を使った方法の改良版とも言えます。

ただし、もちろん置換用の単語を適当にしてしまっては逆に分かりにくくなってしまうでしょう。

また、万が一元の文章に置換用の単語と全く同じ単語が含まれていた場合、想定外の部分に変数が入ってしまうおそれもあります。

おまけ:文字列内で変数を展開することはできない

これまで3つ紹介してきましたが、もっとも理想は、以下のように文字列内で変数を展開することではないでしょうか。

String variable = "world";

String text = "Hello ${variable}!";

System.out.println(text);

ですが、残念ながら以下のように出力されます。

結果

Hello ${variable}!

Javaではこの方法は使えません。

ただし、まだプレビューではあるものの、Java21から「String Templates」として文字列内での変数展開の方法が示されています。

openjdk.org

将来この機能が正式採用されれば、非常に有力な選択肢となるでしょう。

最後に

Javaで文字列に変数を挿入する方法を3つ紹介してきました。

それぞれメリット・デメリットがあるので、適切に使い分けると良いでしょう。

また、例えばURLを組み立てるときに UriComponentsBuilder を使えば、文字列への変数挿入を行わなくてもクエリパラメータの組み立てなどを行うことが可能です。

文字列への変数挿入を行いたい場合は、そもそもまず文字列への変数挿入が必要なのかというところから考え始めても良いかもしれません。