PR

【Java】Optional.of()とofNullable()の違いとは?初心者向けに1からわかりやすく解説

Java

JavaでOptionalを学んでいると、Optional.of()Optional.ofNullable() がよく似ていて迷いやすいです。結論からいうと、null の可能性がある値を包むなら ofNullable()、絶対に null ではないと分かっている値を包むなら of() と考えると整理しやすいです。

このページでは、Java Optional の基本記事を読んだ次の一歩として、2つの違い、null を渡したときの動き、実務での使い分けを初心者向けにわかりやすく解説します。

いちばん大事なのは、of() に null を渡すとすぐに NullPointerException になる ことです。

スポンサーリンク

結論: of() と ofNullable() の違い

まずは違いを表で押さえましょう。

項目 of() ofNullable()
null を渡せるか 渡せない 渡せる
null を渡したとき NullPointerException Optional.empty() になる
意味 値が必ずある前提で包む null かもしれない値を安全に包む
向いている場面 絶対に null でない値 外部入力や取得結果が null かもしれない値

ポイント 迷ったら「この値は null になり得るか」を先に考えると、of()ofNullable() を選びやすくなります

まずは基本的な書き方を見てみよう

使い方そのものはシンプルです。

String userId = "A001";
String nickname = getNickname();

Optional<String> userIdOptional = Optional.of(userId);
Optional<String> nicknameOptional = Optional.ofNullable(nickname);
  • Optional.of(userId): 値が必ず入っている前提で Optional を作る
  • Optional.ofNullable(nickname): 値が null かもしれない前提で Optional を作る

見た目は似ていますが、null への対応がまったく違います。ここをあいまいにすると、思わぬ例外や分かりにくいコードにつながります。

いちばん大事なのは「null を渡したときの動き」の違い

実際のコードで見ると、違いがはっきり分かります。

String name = null;

Optional<String> a = Optional.of(name);          // ここで例外
Optional<String> b = Optional.ofNullable(name);  // Optional.empty()

of() は、「ここに入る値は null ではないはずです」という前提をそのままコードにしたメソッドです。そのため、null を渡すと 前提が壊れていることをその場で知らせるために例外になります

一方で ofNullable() は、null が来る可能性を受け入れた上で Optional に変換します。null の場合は Optional.empty() になるため、あとで orElse()ifPresent() などにつなげやすくなります。

イメージ of() は「null は想定外」、ofNullable() は「null も想定内」です

なぜこの違いが重要なのか

実務では、値の出どころによって null の可能性がかなり変わります。

  • データベースから取ってきた任意項目
  • API のレスポンスに含まれる省略可能な値
  • フォーム入力や検索結果
  • 自分で直前に new したオブジェクトや定数

前半のような「外から来る値」は null になることがあります。この場合に of() を使うと、実行時に NullPointerException が出てしまうことがあります。

逆に、null ではないことが仕様上はっきりしている値にまで ofNullable() を使うと、どこで null を許していて、どこで許していないのかが読み取りにくくなることがあります。

実務の感覚 安全性だけでなく、「この値に null を許すのか」という設計意図を表せるのもメソッド選択の大事なポイントです

どう使い分ければよいのか

of() が向いている場面

  • 値が null ではないと仕様で決まっているとき
  • 自分で生成したオブジェクトや定数を包むとき
  • null が来たら早めに気づきたいとき
String status = "ACTIVE";
Optional<String> statusOptional = Optional.of(status);

このように、値が必ずあると分かっている場面なら of() が素直です。

ofNullable() が向いている場面

  • 値が null の可能性を持っているとき
  • 既存コードの戻り値が null を返すことがあるとき
  • null チェックの分岐を減らしたいとき
String nickname = resultSet.getString("nickname");
Optional<String> nicknameOptional = Optional.ofNullable(nickname);

この例なら、ニックネームが未登録でも例外にならず、あとで orElse()map() につなげられます。

Optional.empty() との関係も知っておこう

ofNullable(null) は、結果として Optional.empty() と同じ状態になります。

Optional<String> a = Optional.ofNullable(null);
Optional<String> b = Optional.empty();

どちらも「中に値がない Optional」です。違いは、ofNullable() は「元の値を受け取って変換する」場面で使い、empty() は「最初から空の Optional を明示したい」場面で使うことです。

Optional の基本記事で全体像を押さえたあとに、この違いまで理解しておくと、Optional の扱いがかなり自然になります。

よくある疑問

ofNullable() だけ使えば安全では?

安全に見えますが、常にそれでよいとは限りません。null が来てはいけない値まで ofNullable() で受けると、設計ミスに気づきにくくなることがあります。「null を許す値だけ ofNullable() にする」ほうが意図が伝わりやすい です。

of() は危険なメソッドなの?

危険というより、前提を厳しく表現するメソッドです。null でないことが保証されている値なら問題ありません。むしろ、前提が崩れたときに早く気づけるという利点があります。

このあと何を覚えるとよい?

次は、Optional が空だったときの扱いとして orElse() と orElseGet() の違い を押さえるのがおすすめです。あわせて ジェネリクス を理解すると、Optional<T> の見え方もかなり整理されます。

まとめ of()ofNullable() の使い分け

  • of() は null を許さない値を包むメソッド
  • ofNullable() は null かもしれない値を安全に包むメソッド
  • of(null)NullPointerException になる
  • ofNullable(null)Optional.empty() になる
  • 選び方の基準は「その値に null の可能性があるかどうか」

of()ofNullable() の違いを理解すると、Optional をただ書くだけでなく、設計意図まで含めて使い分けられるようになります。Optional 全体を復習したい人は 基本記事、空だったときの扱いまで進みたい人は orElse() と orElseGet() の記事 もあわせて読むのがおすすめです。

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