1. 導入:なぜ文字列フォーマットが重要なのか
Javaでの開発において、ログ出力や画面表示のために「変数と固定文字列を組み合わせる」処理は頻繁に行われます。単純な文字列連結(+演算子)はコードが煩雑になりやすく、特に複数の変数を埋め込む場合は可読性が著しく低下します。本記事では、コードをスッキリと読みやすく保つための「String.format()」と、Java 15から導入された便利な「String.formatted()」の使い方を解説します。
2. 基礎知識:フォーマットメソッドとは
これらは「フォーマット文字列(書式指定子)」を使用して、文字列の中に変数を埋め込む仕組みです。
・%s: 文字列として出力
・%d: 整数として出力
・%f: 浮動小数点数として出力
これらを使うことで、「名前は〇〇、年齢は△△歳です」といったテンプレートを先に定義し、後から値を流し込む形になるため、コードの見通しが良くなります。
3. 実装と解決策
String.format()は静的メソッドであり、どこからでも呼び出せる汎用性の高さが魅力です。一方、Java 15で登場したString.formatted()は、文字列インスタンス自身に対して呼び出すため、より直感的なメソッドチェーンが可能です。
4. サンプルプログラム
以下のコードは、Javaのレコード(Record)と組み合わせて、効率的に文字列を生成する例です。
public class FormatExample {
// データを保持するレコードを定義
public record User(String name, int age, double score) {}
public static void main(String[] args) {
User user = new User("山田太郎", 28, 95.5);
// 従来の方法:String.format()を使用
String message1 = String.format("ユーザー名: %s, 年齢: %d歳", user.name(), user.age());
System.out.println(message1);
// Java 15以降:String.formatted()を使用
// 文字列リテラルに対して直接呼び出せるため簡潔
String message2 = "スコア: %.1f".formatted(user.score());
System.out.println(message2);
// 注意点:Optionalや配列を扱う場合
// Optionalの中身を取り出してから渡す必要がある
java.util.Optional<String> opt = java.util.Optional.of("Java開発者");
String message3 = "肩書き: %s".formatted(opt.orElse("未設定"));
System.out.println(message3);
}
}
5. 応用・注意点:現場で陥りやすい罠
実務でこれらのメソッドを使う際は、以下の点に注意してください。
・パフォーマンスへの配慮: String.format()は内部的に正規表現の解析などを行うため、高頻度で呼ばれるループ内での使用は避けるべきです。パフォーマンスが極めて重要な箇所では、StringBuilderを使用してください。
・nullの取り扱い: フォーマット文字列に対応する引数がnullの場合、”%s”であれば”null”という文字列に変換されますが、予期せぬ挙動を防ぐためにOptionalや三項演算子でガードすることをお勧めします。
・型不一致の回避: %dに対して浮動小数点数を渡すとIllegalFormatExceptionが発生します。コンパイル時のチェックが効かないため、特に型が複雑になる場合は、IDEの静的解析機能を活用してバグを未然に防ぎましょう。
適切な場面でこれらのメソッドを使い分け、メンテナンス性の高いコードを目指してください。

コメント