Я прочитал here почему Optional.of()
следует использовать более Optional.ofNullable()
, но ответ не удовлетворил меня на всех, поэтому я прошу немного иначе:Есть ли настоящая причина использования опции Optional.of()?
Если вы уверены, что ваш метод не возвращает null
, зачем вы используете Optional
? Насколько мне известно, более или менее единственная цель - напомнить «пользователю метода», что ему, возможно, придется иметь дело с null
-значениями. Если ему не нужно иметь дело с -значениями, то почему он должен быть обеспокоен Optional
?
Я спрашиваю, потому что я недавно сделал свой служебный слой вместо Опций вместо нулей (в определенных ситуациях). Я использовал Optional.of()
и был очень смущен, когда он бросил NullPointer.
образец того, что я сделал:
Optional valueFromDB = getUserById("12");
User user = valueFromDB.get();
.....
public Optional<User> getUserById(String id) {
//...
return Optional.of(userRepository.findOne(id)); // NullPointerException!
}
Если нуль не возможно, я не понимаю, почему можно было бы обернуть его в Optional
. Чувак в связанном ответе сказал: «Хорошо, если происходит NullPointer, это происходит сразу!» Но я действительно этого хочу? Если единственная цель Optional
состоит в том, чтобы напомнить программисту, который получает такой объект, держать в голове null
(он должен его развернуть), почему я должен иметь NullPointerException
во время упаковки?
Edit: мне нужно изменить этот вопрос, потому что он был отмечен как дубликат, даже если я уже сказал связан вопрос с самого начала. Я также объяснил, почему ответ меня не удовлетворил, но теперь мне нужно отредактировать свой текст с объяснением. Но вот некоторое приложение к тому, что я хочу спросить, так как я получил 5 ответов, и каждый отвечает на другой случай, но ни один полностью не покрыт, что я пытаюсь спросить здесь:
Есть ли причина, что Optional.of (null) невозможно, и они специально добавили Optional.ofNullable() для нулевого случая?
Использование потоков не должно быть проблемой с моей идеей реализации. Я получил много информации из ваших ответов, спасибо за это. Но реальный вопрос до сих пор не ответил, насколько я могу сказать/прочитать/понять. Возможно, мне следовало спросить: «Что, если мы удалим метод Optional.of()
и допустим только Optional.ofNullable()
в Java 9, возникла бы проблема, кроме обратной совместимости?»
Единственная цель «Необязательно» - четко указать, что результата не может быть. При правильном использовании вам не нужно делать «нулевые» проверки, а yu может выполнять user.ifPresent (doAMethod()) или использовать его в потоках и других API JDK8 без необходимости проверять элементы «null». Поэтому при правильном использовании он может уменьшить количество нулевой проверки в вашем коде. –
@ M.Deinum: 'ifPresent' - это, в основном, нуль-чек. : P Это просто выглядит лучше и удобнее в использовании. Тем не менее, я получаю информацию с потоками, но это не имеет никакого отношения к самому вопросу. Я не задавал вопросы о Optionals, я задал вопрос, если 'Optional.of()' полезна. Извините, если это не ясно. – codepleb
Если ваш метод не предназначен для возврата null, с одной стороны, я согласен, что вы не хотите возвращать 'Optional'. С другой стороны, вы хотите получить информацию, если в один прекрасный день значение, которое вы собираетесь вернуть, является нулевым по ошибке. Для этого я использовал бы добрый старый аргумент 'assert'. –