Java Gold SE11対策:Optionalはなぜ必要なのか?nullを扱えるJavaであえて使う理由を解説

アイキャッチ画像

Javaでは、null は日常的に登場します。そして同時に、null によるエラー ― そう、NullPointerException(NPE)もまた、Javaにおける最大のトラブルメーカーです。

Java 8で登場した Optional は、「nullの罠」を避けるための新しい考え方です。
でも疑問に思いませんか?

「参照型ならそもそもnullを扱えるのに、わざわざ別のクラスで包む意味あるの?」

この記事では、その問いに正面から答えつつ、Optionalがなぜ必要なのか、そして他の参照型とは何が違うのかを分かりやすく解説します。

1. Javaにおけるnullの問題点

Javaでは、参照型の変数は初期化しないとnullになります。

String name = null;

System.out.println(name.toUpperCase()); // NullPointerException!

このコード、コンパイルエラーにはなりません。
でも実行するとクラッシュします。

つまり、Javaでは「nullかもしれない」ということがコード上から分からないのです。

2. Optionalとは何か

Optional<T> は、値が「あるかもしれない/ないかもしれない」を明示的に扱うためのラッパークラスです。

Optional<String> name = Optional.of(“Alice”);

Optional<String> empty = Optional.empty();

  • 中身があるかどうかは isPresent() や ifPresent(…) で確認
  • 値がなければ orElse(…) などでデフォルトを使う
  • null をそのまま渡すと例外になる → Optional.ofNullable(…) で包む

3. Optionalは参照型 ― でも普通の参照型とは違う

Optional自身も普通のクラスなので、もちろん参照型です。

ですが、他の参照型(StringやUserなど)と違って、Optionalには次の特徴があります:

特徴通常の参照型Optional
nullの可能性があるある(暗黙)ある(明示)
値があるか構文で分かるか分からない分かる(isPresentや型で示せる)
チェックが強制されるかされない強制される(orElseなどで)
使い方の流れが明確になるか曖昧明確(map/filterなどのチェーン)

つまり、Optionalはただのnull回避テクニックではなく、設計意図をコードで表現できる手段なのです。

4. 「nullでいいじゃん」と言えない理由

たとえば以下の2つのメソッドの違いを見てください:

// A. nullの可能性があるが何も示されない

public String findNameById(String id) { … }

// B. nullになるかもしれないことが型で明示される

public Optional<String> findNameById(String id) { … }

呼び出す側はどうでしょう?

Aのようなメソッドでは、戻り値がnullかどうかをJavadocを読まないとわからない
BのようにOptionalを返せば、「値がない可能性がある」ことが型を見ただけで明確に伝わります。

5. Optionalは「構文レベルのnull明示」である

従来のnullチェックはこんな感じでした:

String name = getName();

if (name != null) {

    System.out.println(name.toUpperCase());

}

Optionalなら:

getNameOptional()

    .map(String::toUpperCase)

    .ifPresent(System.out::println);

  • map や filter によるnull安全な処理の連鎖
  • ifPresent, orElse, orElseThrow など制御の明示性

コード全体が「空である可能性」を前提として動く構文になるのです。

6. Optionalを使うべきところ/使うべきでないところ

✅ 使うべき場面

  • 戻り値として「値がない可能性がある」と設計上明示したいとき
  • nullが来るとバグになるような重要な参照型の扱い

❌ 使うべきでない場面

  • 引数やフィールドにOptional(Javaの設計方針上、非推奨)
  • Optional<List<T>> のような「2重の空」の状態 → 空のリストで代用すべき

まとめ

Optionalはただの「nullラッパー」ではありません。
Javaという言語に染みついていた「nullの闇」に、構文と型の力で立ち向かうための設計手段です。

  • null は黙ってクラッシュする
  • Optional は空であることを明示し、対応を促す

現代的なJavaを書くうえで、Optionalは欠かせない設計パターンのひとつです。
「使わなくても動く」けど、「使えば事故を防げる」。それがOptionalの本質です。