В чем разница между Optional.of() и Optional.ofNullable() в Java?

Ответ

Разница заключается в допустимости null-аргумента и, как следствие, в поведении при его передаче.

Optional.of(T value)

  • Требование: Аргумент value не должен быть null.
  • Поведение при null: Немедленно выбрасывает NullPointerException.
  • Использование: Когда вы на 100% уверены, что значение не null. Часто используется для оборачивания результатов собственных вычислений или констант.
Optional<String> nonNullOpt = Optional.of("Hello"); // OK
Optional<String> willCrash = Optional.of(null);     // Выбросит NPE сразу же!

Optional.ofNullable(T value)

  • Требование: Аргумент value может быть null.
  • Поведение при null: Возвращает пустой Optional (Optional.empty()).
  • Использование: Когда значение приходит из внешнего источника (например, из базы данных, другого метода, пользовательского ввода), где null является допустимым сценарием.
String possiblyNull = getValueFromExternalSource();
Optional<String> safeOpt = Optional.ofNullable(possiblyNull);
// Если possiblyNull == null, safeOpt будет Optional.empty()

Практическое правило

  • Используйте Optional.of(x) как утверждение (assertion), что x != null. Это защита от ошибок программиста.
  • Используйте Optional.ofNullable(x) для безопасной обработки потенциально null-значений извне.

Важно: Никогда не передавайте в Optional.of() результат вызова метода, который может вернуть null, если вы не проверили его предварительно. Всегда используйте ofNullable() для таких случаев.

Ответ 18+ 🔞

А, слушай, смотри, тут есть одна тонкость, про которую многие ломаются, как дрова. Разница — в том, как эти методы относятся к null, и это, блядь, принципиально.

Optional.of(T value)

Этот метод — как тот самый принципиальный дед, который терпеть не может пустоту. Он ни в какую не принимает null.

  • Что требует: Аргумент value ни в коем случае не должен быть null, ёпта.
  • Что будет, если нагнешь: Мгновенный, блядь, NullPointerException прямо в ебальник. Не будет он с тобой церемониться.
  • Когда юзать: Только когда ты на все сто, блядь, уверен, что там что-то есть. Типа оборачиваешь результат своей же железобетонной логики или какую-нибудь константу.
Optional<String> nonNullOpt = Optional.of("Hello"); // Нормально, всё чики-пуки
Optional<String> willCrash = Optional.of(null);     // Пиздец! NPE на месте, даже не пикнешь!

Optional.ofNullable(T value)

А вот этот — уже поспокойнее, философ. Он допускает null.

  • Что требует: Аргумент value спокойно может быть null, без истерик.
  • Что будет, если нагнешь: Вернёт тебе, сука, пустой Optional (Optional.empty()). Типа "ну нет так нет, живём дальше".
  • Когда юзать: Когда значение приплывает откуда-то сбоку — из базы, от другого сервиса, от пользователя, который вечно хуйню вводит. Там null — это обычное дело.
String possiblyNull = getValueFromExternalSource(); // А хрен его знает, что вернёт
Optional<String> safeOpt = Optional.ofNullable(possiblyNull);
// Если possiblyNull == null, то safeOpt будет просто Optional.empty(). Никакого пиздеца.

Короче, правило на пальцах

  • Optional.of(x) — это как крикнуть: "Я, блядь, уверен, что x не null!". Это защита от самого себя, от собственных косяков.
  • Optional.ofNullable(x) — это как сказать: "А ну-ка, x, покажись... А, нуль? Ну и ладно, пустой контейнер сделаем". Это защита от внешнего, ебаного, непредсказуемого мира.

Запомни раз и навсегда: Не суй в Optional.of() результат метода, который может вернуть null, не проверив. Это самоубийство. Для такой трясины есть ofNullable(). Всё, вопрос закрыт.