При использовании Optional
класса Java 8 существует два способа, которыми значение может быть заключено в необязательный.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Я понимаю, Optional.ofNullable
что это единственный безопасный способ использования Optional
, но почему он вообще Optional.of
существует? Почему бы просто не использовать Optional.ofNullable
и всегда быть в безопасности?
java.util.Optional
- он доступен, если вы используете JDK 8 или более позднююofNullable()
of()
of()
ofNotNull()
Ответы:
Ваш вопрос основан на предположении, что код, который может выдать
NullPointerException
, хуже, чем код, который не может. Это предположение неверно. Если вы ожидаете, что вашfoobar
код никогда не равен нулю из-за логики программы, его лучше использовать, такOptional.of(foobar)
как вы увидите,NullPointerException
что укажет на наличие ошибки в вашей программе. Если вы используете,Optional.ofNullable(foobar)
и этоfoobar
происходитnull
из-за ошибки, то ваша программа будет продолжать работать некорректно, что может быть большим бедствием. Таким образом, ошибка может появиться намного позже, и было бы намного сложнее понять, в какой момент она пошла не так.источник
Optional.of(foobar)
». Это кажется немного странным - когда мы знаем, что значение не будетnull
в любом случае, то почему бы не использовать само значение вместо того, чтобы заключать его вOptional
?Optional
from, как того требует интерфейс, который вы реализуете (возможно, другие разработчики могут вернуть пустой необязательный параметр). Или вы хотите создать коллекцию / поток опциональных файлов, некоторые из которых гарантированно ненулевые, а некоторые нет. Или у вас есть условная логика, которая создает необязательную в нескольких ветвях, а в одной ветке вы уверены, что она не равна нулю.null
в этом случае означает «я ожидаю, что будет присутствовать foobar, но из-за ошибки он нулевой».Optional.isPresent() == false
означает, что foobar отсутствует, то есть это ожидаемое, законное поведение.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));
list
null
Кроме того, если вы знаете, что ваш код не должен работать, если объект равен нулю, вы можете вызвать исключение, используя
Optional.orElseThrow
источник
String name = Objects.requireNonNull(nullName);
NullPointerException
когда проблема явно является ссылкой,null
хотя она не должна, была бы шагом в неверном направлении.new NullNameException("meaningful msg")
Это зависит от сценариев.
Допустим, у вас есть бизнес-функциональность, и вам нужно обрабатывать что-то с этим значением, но
null
значение во время обработки может повлиять на это.Тогда, в этом случае, вы можете использовать
Optional<?>
.источник
Факультативно в любом случае следует в основном использовать для результатов Сервисов. В сервисе вы знаете, что у вас под рукой, и возвращаете Optional.of (someValue), если у вас есть результат, и возвращаете Optional.empty (), если у вас его нет. В этом случае некоторое значение никогда не должно быть нулевым, и все же вы возвращаете Optional.
источник