2026年1月18日日曜日

【Java】Stringの空判定でもう迷わない!参照型の理解と「nullを発生させない」設計術

1. Stringは「プリミティブ型」の皮を被った「参照型」

Javaを学び始めた頃、int(基本型)と同じ感覚で String(参照型)を扱って失敗しました。 Stringはオブジェクトなので、変数には「文字列そのもの」ではなく、**「メモリ上のどこにあるか(住所)」**が入っています。

  • == の罠: 住所が同じかを比較してしまう。

  • .equals() 部屋の中身(文字列)が同じかを比較する。


2. 空白判定の使い分け(再整理)

「中身がない」状態を正しく判定するための、Java 11以降のベストプラクティスです。

  • isEmpty() 文字数が0か?

  • isBlank() 半角・全角スペースを除いて中身があるか?(実務ではこちらが主流)


3. そもそも「null判定」を減らすための工夫

if (str != null) を書き続けるのは疲れますよね。設計の工夫でこの判定を減らすことができます。

① 変数宣言時に「空文字」で初期化する null で初期化するのではなく、デフォルトを "" にします。

Java
// 悪い例:nullで初期化
String name = null; 

// 良い例:空文字で初期化
String name = ""; 
// これだけで name.isBlank() で落ちることがなくなります

② Optionalを活用する(Java 8〜) 「値がないかもしれない」ことを明示し、安全に処理を繋げます。

Java
Optional.ofNullable(getInput())
    .filter(s -> !s.isBlank())
    .orElse("デフォルト名"); // nullや空白ならこれを使う

③ 定数を左側に置く(ヨダ記法) リテラル(定数)は絶対に null ではない性質を利用します。

Java
if ("ADMIN".equals(userRole)) { ... } 
// userRoleがnullでもエラーにならず false を返すだけ


4. まとめ:安全なコードは「型」の理解から

「メソッドを知っている」ことよりも、**「Stringが参照型であることを意識し、nullを混ぜない設計にする」**ことの方が、バグを防ぐ上では重要だと納得しました。

判定項目 推奨コード ポイント
内容の比較 "値".equals(str) == は参照(住所)を比較するのでNG。
空白・空文字 str.isBlank() Java11〜。スペースだけの入力も「空」とみなす。
null回避策 Optional.ofNullable nullチェックの if文 を減らしてスマートに。


0 件のコメント:

コメントを投稿

【Java】List, Set, Mapはどう選ぶ?Collectionフレームワークの使い分けと性能の正体

1. 導入:データを入れる「器」を間違えるとどうなるか? 「とりあえず ArrayList に入れて、重複チェックを for文で回す……」 そのコード、データが10万件になっても大丈夫ですか? Javaの Collection には多くのクラスがありますが、それぞれに「得意な仕事...