JavaのOptionalクラスは、「nullを使わずに、安全に値を扱う」ための便利なツールです。しかし、使い方を間違えると、逆にコードが読みにくくなったり、バグを招いたりすることも。
このブログでは、初心者でもわかるように、Optionalの「正しい使い方」と「やってはいけない使い方」を丁寧に解説します。Optionalをマスターして、安全で読みやすいJavaコードを書けるようになりましょう!
✅ 正しい使い方
1. メソッドの戻り値に使う
「値があるかもしれない」「値がないかもしれない」といったケースにOptionalは最適です。
|
1 2 3 4 |
public Optional<User> findUserById(String id) { return userMap.containsKey(id) ? Optional.of(userMap.get(id)) : Optional.empty(); } |
呼び出し側ではOptionalを通じて、安全に値を扱えます。
2. nullではなく、Optional.ofNullableを使う
nullを返すのではなく、Optional.empty()やOptional.ofNullable()を使って明示的に「空」であることを示します。
|
1 2 3 |
String maybe = getNullableString(); Optional<String> optional = Optional.ofNullable(maybe); |
3. get()を直接使わず、ifPresent、orElse、orElseThrowを使う
|
1 2 3 4 |
optional.ifPresent(name -> System.out.println(name)); String name = optional.orElse("デフォルト名"); |
安全に値を取り出せる方法を活用しましょう。
4. mapやflatMapを使ってチェーン処理
Optionalの中身を操作するにはmapやflatMapが便利です。
|
1 2 3 |
String name = optionalUser.map(User::getName) .orElse("名無し"); |
❌ やってはいけない使い方
1. Optionalを引数に使う
|
1 2 3 |
// これはNG public void printUser(Optional<User> user) { ... } |
Optionalは戻り値で使うもの。引数に使うとコードが複雑になり、意図が伝わりづらくなります。
2. フィールド(メンバ変数)にOptionalを使う
|
1 2 3 |
// これは推奨されません private Optional<Address> address; |
Optionalはフィールドには不向きです。代わりにnullまたはOptional.ofNullable()で処理するほうが自然です。
3. コレクションの中にOptionalを入れる
|
1 2 3 |
// NG例 List<Optional<User>> userList; |
コレクションの要素にOptionalを使うと、扱いづらくなります。空要素を含めないようにフィルタ処理を行うのが適切です。
4. get()を無条件に使う
|
1 2 3 |
// これは例外の原因になります User user = optionalUser.get(); |
Optionalを使う意味がなくなってしまいます。必ずisPresentやorElseでチェックしましょう。
📝 まとめ:Optionalを正しく使うために
| やるべきこと | やってはいけないこと |
|---|---|
| メソッドの戻り値に使う | メソッドの引数に使う |
| nullの代わりにOptional.ofNullable | Optionalをフィールドに使う |
| map, flatMap, orElseを使う | get()を無条件に使う |
| チェック付きで中身を使う | コレクションにOptionalを入れる |
Optionalを上手に使えば、Javaのコードは驚くほど安全で読みやすくなります。「nullチェックだらけ」のコードとはおさらばしましょう!
📘 さらに学びたい人へ
Optional以外にも、Javaにはたくさんの便利な機能があります。しっかり基礎を学びたい人にはこちら:
コードレビュー・転職サポートまで受けたい人にはこちら:
Optionalを味方にして、スマートなJavaコードを書けるエンジニアになりましょう!


コメント