Java 8のOptional
クラスを使用する場合、値をオプションで囲むことができる2つの方法があります。
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Optional.ofNullable
がOptional
を使用する唯一の安全な方法であることを私は理解していますが、なぜOptional.of
がまったく存在しないのですか?なぜOptional.ofNullable
を使って常に安全な側にいないのですか?
あなたの質問はNullPointerException
を投げるかもしれないコードがそうでないかもしれないコードより悪いという仮定に基づいています。この仮定は間違っています。 foobar
がプログラムロジックのためにnullになることは決してないと予想する場合は、NullPointerException
が表示されるのでOptional.of(foobar)
を使用するほうがはるかに良いでしょう。これはプログラムにバグがあることを示します。あなたがOptional.ofNullable(foobar)
を使っていて、foobar
がバグのためにnull
になっていると、あなたのプログラムは黙って間違った働きをし続けるでしょう、それはより大きな災難かもしれません。このようにして、エラーはずっと後で起こるかもしれず、それがどの時点でそれがうまくいかなかったかを理解することははるかに難しいでしょう。
さらに、objectがnullの場合にコードが機能しないことがわかっている場合は、Optional.orElseThrow
を使用して例外をスローすることができます。
String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);
@ tagir-valeev 、間違っていたら訂正してください。
これはシナリオに完全に依存しています。Optionalクラスにはプライベートコンストラクタがあるため、newキーワードを使用してオブジェクトを作成することはできません。要件に応じて、メソッドのいずれかを使用できます
要約すると、値がnullではないことが確実な場合はof()を使用でき、値がnullでもかまわないと思われる場合はofNullable()を使用できます。
詳細については、Java 8でオプションオブジェクトを作成する方法を参照してください
とにかくオプションは主にサービスの結果に使用されるべきです。このサービスでは、自分が現在持っているものを知っていて、結果があればOptional.of(someValue)を返し、そうでなければOptional.empty()を返します。この場合、値がnullになることはありません。それでも、Optionalを返します。
これはシナリオに依存します。
いくつかのビジネス機能があり、その値でさらに処理する必要があるとしましょう。ただし、処理時にnull
値があると影響を受けます。
次に、その場合、Optional<?>
を使用できます。
String nullName = null;
String name = Optional.ofNullable(nullName)
.map(<doSomething>)
.orElse("Default value in case of null");