【Java学習|豆知識】Java文字列操作の最適解:String.format()とJava 15からの新機能formatted()を使いこなす

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の静的解析機能を活用してバグを未然に防ぎましょう。

適切な場面でこれらのメソッドを使い分け、メンテナンス性の高いコードを目指してください。

コメント

タイトルとURLをコピーしました