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 かもしれない値 |
まずは基本的な書き方を見てみよう
使い方そのものはシンプルです。
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 を許していて、どこで許していないのかが読み取りにくくなることがあります。
どう使い分ければよいのか
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() の違いを理解すると、Optional をただ書くだけでなく、設計意図まで含めて使い分けられるようになります。Optional 全体を復習したい人は 基本記事、空だったときの扱いまで進みたい人は orElse() と orElseGet() の記事 もあわせて読むのがおすすめです。
