Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Optionalをもっと使いたい

 Optionalをもっと使いたい

Avatar for Yoshihiro Yoneyama

Yoshihiro Yoneyama

June 08, 2025
Tweet

Other Decks in Programming

Transcript

  1. をもっと使いたい Optional 米山佳宏 JJUG CCC 2025 Spring Lightning Talk ヨネヤマ

    ヨシヒロ (BABY JOB 株式会社 バックエンドエンジニア)
  2. Exception in thread "main" java.lang.NullPointerException: Attempt to call method on

    null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) 結 論
  3. Exception in thread "main" java.lang.NullPointerException: Attempt to call method on

    null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) 大丈夫 結 論 ※ドメインモデルにおいて
  4. Exception in thread "main" java.lang.NullPointerException: Attempt to call method on

    null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) ドメインモデル 自体の表現力が高くなる Optionalを使う設計レベルのメリット
  5. @AllArgsConstructor class User { String name; int age; String address;

    } @AllArgsConstructor class User { @NonNull String name; @NonNull int age; @NonNull Optional<String> address; } Optional 無し Optional 有り
  6. @AllArgsConstructor class User { String name; int age; String address;

    } @AllArgsConstructor class User { @NonNull String name; @NonNull int age; @NonNull Optional<String> address; } Optional 無し Optional 有り 各フィールドが 未入力の可能性があるかが わからない
  7. @AllArgsConstructor class User { String name; int age; String address;

    } @AllArgsConstructor class User { @NonNull String name; @NonNull int age; @NonNull Optional<String> address; } Optional 無し Optional 有り 各フィールドが 未入力の可能性があるかが わからない 各フィールドが 未入力の可能性があるかが わかる!
  8. Exception in thread "main" java.lang.NullPointerException: Attempt to call method on

    null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) 実装上のメリットもあるんだよ! / \
  9. @AllArgsConstructor class User { @NonNull String name; @NonNull int age;

    @NonNull Optional< String > address; } addressは存在しないこともあるんだな
  10. @AllArgsConstructor class User { @NonNull String name; @NonNull int age;

    @NonNull Optional<String> address; } 型レベルでnullの使用を防ぐことができる
  11. @AllArgsConstructor class User { @NonNull String name; @NonNull int age;

    @Nullable String address; public Optional<String> getAddress() { return Optional.ofNullable(this.address) } }
  12. @AllArgsConstructor class User { @NonNull String name; @NonNull int age;

    @Nullable String address; public Optional<String> getAddress() { return Optional.ofNullable(this.address) } } @AllArgsConstructor class User { @NonNull String name; @NonNull int age; @NonNull Optional<String> address; } Before After
  13. @AllArgsConstructor class User { @NonNull String name; @NonNull int age;

    @Nullable String address; public Optional<String> getAddress() { return Optional.ofNullable(this.address) } } @AllArgsConstructor class User { @NonNull String name; @NonNull int age; @NonNull Optional<String> address; } Before After 明らかにスッキリ!
  14. Exception in thread "main" java.lang.NullPointerException: Attempt to call method on

    null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) Exception in thread "main" java.lang.NullPointerException: Attempt to call method on null object reference at com.example.FakeClass.method(FakeClass.java:42) 以上