Зачем использовать Необязательный.выше опции Optional.ofNullable?

При использовании класса Java 8 Optional существует два способа, в которых значение может быть обернуто в необязательный.

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

Я понимаю, что Optional.ofNullable - единственный безопасный способ использования Optional, но почему существует Optional.of вообще? Почему бы просто не использовать Optional.ofNullable и всегда быть в безопасности?

Ответ 1

Ваш вопрос основан на предположении, что код, который может бросать NullPointerException, хуже кода, который не может быть. Это предположение неверно. Если вы ожидаете, что ваш foobar никогда не является нулевым из-за логики программы, гораздо лучше использовать Optional.of(foobar), поскольку вы увидите NullPointerException, который укажет, что ваша программа имеет ошибку. Если вы используете Optional.ofNullable(foobar), а foobar окажется null из-за ошибки, ваша программа будет тихо продолжать работать некорректно, что может быть большой катастрофой. Таким образом, ошибка может произойти намного позже, и было бы намного сложнее понять, в какой момент это пошло не так.

Ответ 2

Кроме того, если вы знаете, что ваш код не должен работать, если объект имеет значение null, вы можете исключить исключение с помощью параметра Optional.orElseThrow

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

@tagir-valeev, Пожалуйста, исправьте, если я ошибаюсь.

Ответ 3

Это полностью зависит от сценариев, у класса Optional есть закрытый конструктор, поэтому мы не можем создать объект с помощью нового ключевого слова. В зависимости от требования мы можем использовать метод

  • empty(): для объекта без значения, Insted используя null, мы можем использовать Optional.empty()
  • of (T value): create Необязательный для некоторого значения: в этом методе нулевое значение не допускается.
  • ofNullable (значение T): создать Необязательный некоторого значения, и если значение может быть нулевым

Таким образом, мы можем сказать, что если вы уверены, что значение не равно нулю, вы можете использовать of(), и если вы считаете, что значение может быть нулевым, вы должны использовать ofNullable()

Для более подробной информации вы можете обратиться к тому, как создать опцию объекта в Java 8

Ответ 4

Необязательно, в основном, должны использоваться для получения результатов Услуг. В сервисе вы знаете, что у вас есть, и возвратите Option.of(someValue), если у вас есть результат и возвратите Option.empty(), если вы этого не сделаете. В этом случае некоторая ценность никогда не должна быть нулевой и все же, вы возвращаете Необязательный.

Ответ 5

Это зависит от сценариев.

Допустим, у вас есть бизнес-функциональность, и вам нужно обрабатывать что-то с этим значением дальше, но это может повлиять на null значение во время обработки.

Тогда, в этом случае, вы можете использовать Optional<?>.

String nullName = null;

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