Ответ
Разница заключается в допустимости 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(). Всё, вопрос закрыт.