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をコピーしました