web-dev-qa-db-ja.com

Optional.ofNullableよりもOptional.ofを使用する理由

Java 8のOptionalクラスを使用する場合、値をオプションで囲むことができる2つの方法があります。

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

Optional.ofNullableOptionalを使用する唯一の安全な方法であることを私は理解していますが、なぜOptional.ofがまったく存在しないのですか?なぜOptional.ofNullableを使って常に安全な側にいないのですか?

191
whirlwin

あなたの質問はNullPointerExceptionを投げるかもしれないコードがそうでないかもしれないコードより悪いという仮定に基づいています。この仮定は間違っています。 foobarがプログラムロジックのためにnullになることは決してないと予想する場合は、NullPointerExceptionが表示されるのでOptional.of(foobar)を使用するほうがはるかに良いでしょう。これはプログラムにバグがあることを示します。あなたがOptional.ofNullable(foobar)を使っていて、foobarがバグのためにnullになっていると、あなたのプログラムは黙って間違った働きをし続けるでしょう、それはより大きな災難かもしれません。このようにして、エラーはずっと後で起こるかもしれず、それがどの時点でそれがうまくいかなかったかを理解することははるかに難しいでしょう。

244
Tagir Valeev

さらに、objectがnullの場合にコードが機能しないことがわかっている場合は、Optional.orElseThrowを使用して例外をスローすることができます。

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

@ tagir-valeev 、間違っていたら訂正してください。

6
Karan Arora

これはシナリオに完全に依存しています。Optionalクラスにはプライベートコンストラクタがあるため、newキーワードを使用してオブジェクトを作成することはできません。要件に応じて、メソッドのいずれかを使用できます

  • empty():値のないオブジェクトの場合は、nullを使用してInstedを使用すると、Optional.empty()を使用できます。
  • of(T value):create何らかの値のオプション:このメソッドではnull値は許されません
  • ofNullable(T value):createいくつかの値のオプション、およびif値はnullにすることができます

要約すると、値がnullではないことが確実な場合はof()を使用でき、値がnullでもかまわないと思われる場合はofNullable()を使用できます。

詳細については、Java 8でオプションオブジェクトを作成する方法を参照してください

1
Rupesh Agrawal

とにかくオプションは主にサービスの結果に使用されるべきです。このサービスでは、自分が現在持っているものを知っていて、結果があればOptional.of(someValue)を返し、そうでなければOptional.empty()を返します。この場合、値がnullになることはありません。それでも、Optionalを返します。

0
espendennis

これはシナリオに依存します。

いくつかのビジネス機能があり、その値でさらに処理する必要があるとしましょう。ただし、処理時にnull値があると影響を受けます。

次に、その場合、Optional<?>を使用できます。

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");
0