【Java学習|実務向け】Javaの「+」演算子の落とし穴:算術加算と文字列結合の挙動を正しく制御する

導入

Javaを扱う上で最も身近な「+」演算子ですが、実は「算術加算」と「文字列結合」という2つの顔を持っています。この挙動の曖昧さは、特にログ出力や動的なメッセージ生成において、予期せぬバグを引き起こす原因となります。本記事では、この演算子の正しい制御方法と、実務で安全に使い分けるためのポイントを解説します。

基礎知識

Javaにおいて「+」演算子は、オペランド(演算対象)の型によって動作が決定されます。
1. 数値型(int, double等)同士の場合:算術的な「加算」が行われます。
2. 一方または両方がString型の場合:文字列の「連結」が行われます。

ここで注意すべきは、「評価の優先順位」です。左から右へ順次評価されるため、数値計算のつもりで記述したコードが、文字列結合として評価されてしまうケースが頻発します。

実装/解決策

意図しない文字列結合を防ぐための原則は「計算と結合を混ぜない」ことです。もし数値計算の途中で文字列を扱いたい場合は、括弧を使用して計算順序を明示するか、計算結果を一度変数に代入してから結合するように設計します。

また、Java 15以降で導入された「Text Blocks」や、文字列結合の最適化を考慮するなら「String.formatted()」や「StringBuilder」を適切に使い分けることが、可読性とパフォーマンスの観点から推奨されます。

サンプルプログラム

public class PlusOperatorDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;

// 1. ありがちなミス:文字列結合が優先されてしまうケース
// 期待値: “合計は: 30” だが、実際は “合計は: 1020” となる
System.out.println(“合計は: ” + a + b);

// 2. 解決策:括弧を使用して加算を優先する
System.out.println(“合計は: ” + (a + b));

// 3. 実務的な推奨:計算結果を分離し、可読性を高める
int sum = a + b;
String message = String.format(“計算結果: %d”, sum);
System.out.println(message);

// 4. 注意点:nullとの結合
// Stringとnullを結合すると “null” という文字列になる
String nullStr = null;
System.out.println(“値は: ” + nullStr); // “値は: null” と出力される
}
}

応用・注意点

現場で陥りやすいバグの回避策として、以下の3点を意識してください。

1. nullの混入に注意: 文字列結合時に変数がnullの場合、意図せず “null” という文字列が生成されます。データベースから取得した値などを結合する際は、Optionalやnullチェックを挟むことが安全です。
2. ループ内での使用: ループ内で「+」を使って文字列を結合し続けると、内部的に大量のStringBuilderオブジェクトが生成され、メモリ効率が悪化します。ループ内では明示的にStringBuilderを使用してください。
3. 型推論(var)の確認: Java 10以降のvarを使用している場合、型の誤認が起きやすくなります。特に数値計算を行うつもりが、意図せずString型として推論されていないか、IDEの型ヒントを確認する癖をつけましょう。

「+」演算子はシンプルですが、その分、仕様の理解不足が重大なバグに直結します。基本に立ち返り、可読性の高いコードを書くことを心がけてください。

コメント

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