1. Stringは「プリミティブ型」の皮を被った「参照型」
Javaを学び始めた頃、int(基本型)と同じ感覚で String(参照型)を扱って失敗しました。
Stringはオブジェクトなので、変数には「文字列そのもの」ではなく、**「メモリ上のどこにあるか(住所)」**が入っています。
==の罠: 住所が同じかを比較してしまう。.equals(): 部屋の中身(文字列)が同じかを比較する。
2. 空白判定の使い分け(再整理)
「中身がない」状態を正しく判定するための、Java 11以降のベストプラクティスです。
isEmpty(): 文字数が0か?isBlank(): 半角・全角スペースを除いて中身があるか?(実務ではこちらが主流)
3. そもそも「null判定」を減らすための工夫
if (str != null) を書き続けるのは疲れますよね。設計の工夫でこの判定を減らすことができます。
① 変数宣言時に「空文字」で初期化する
null で初期化するのではなく、デフォルトを "" にします。
// 悪い例:nullで初期化
String name = null;
// 良い例:空文字で初期化
String name = "";
// これだけで name.isBlank() で落ちることがなくなります
② Optionalを活用する(Java 8〜) 「値がないかもしれない」ことを明示し、安全に処理を繋げます。
Optional.ofNullable(getInput())
.filter(s -> !s.isBlank())
.orElse("デフォルト名"); // nullや空白ならこれを使う
③ 定数を左側に置く(ヨダ記法)
リテラル(定数)は絶対に null ではない性質を利用します。
if ("ADMIN".equals(userRole)) { ... }
// userRoleがnullでもエラーにならず false を返すだけ
4. まとめ:安全なコードは「型」の理解から
「メソッドを知っている」ことよりも、**「Stringが参照型であることを意識し、nullを混ぜない設計にする」**ことの方が、バグを防ぐ上では重要だと納得しました。
| 判定項目 | 推奨コード | ポイント |
|---|---|---|
| 内容の比較 | "値".equals(str) |
== は参照(住所)を比較するのでNG。 |
| 空白・空文字 | str.isBlank() |
Java11〜。スペースだけの入力も「空」とみなす。 |
| null回避策 | Optional.ofNullable |
nullチェックの if文 を減らしてスマートに。 |
0 件のコメント:
コメントを投稿