1. Optionalとは
Optional(java.util.Optional<T>)とは、Java 8で導入された「値が空(null)」である可能性を表現するためのコンテナオブジェクトです。
イメージとしては、値を直接扱うのではなく、「中身が空かもしれないし、何か入っているかもしれない箱」に包んで扱う仕組みです。
2. nullを直接返す場合との違い
最大の意図は、「呼び出し側に値が空である可能性を明示し、安全な処理を強制すること」にあります。
- nullを直接返す場合: 呼び出し側がnullチェックを忘れると、容易にヌルポ(NullPointerException)が発生します。
- Optionalを返す場合: 開発者はnullが返る可能性に気付ける。また、値の取り出しにはOptionalが提供するメソッドを経由する必要があるため、安全な実装が担保される。
3. Optionalの生成方法
-
Optional.of(): 引数にnullを渡すとNPEが発生するため、引数の値が確実にnullではない場合に使う。 -
Optional.ofNullable(): 引数がnullの場合は、自動的に空のOptionalが返るため、値がnullである可能性がある場合に使用。 -
Optional.empty(): 明示的に空のOptionalオブジェクトを生成する際に使う。
4. 値の有無を確認する
-
isPresent(): 値が存在する場合にtrue、空ならfalseを返す。 -
isEmpty(): 空の場合にtrue、値が存在すればfalseを返します。
※Java 11から、直感的に書けるように isEmpty() が追加された。
5. ifPresent(値が存在する場合だけ処理する)
ifPresent(Consumer) は、値が存在する場合のみ、引数に渡したラムダ式を処理する。
// 従来
if (user != null) {
System.out.println(user.getName());
}
// Optional (ifPresent)
userOpt.ifPresent(user -> System.out.println(user.getName()));
まとめ
Optionalの利点をまとめます。
- 呼び出し側への明示:戻り値をOptionalにする事で、「この値は空(null)かもしれない」という事を呼び出し側の実装者に明示できる。
- Null例外の防止:呼び出し側が空の場合の処理を正しく実装する事で、NullPointerExceptionの発生を抑止しやすくなる。