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

Ответ

Optional.of() и Optional.ofNullable() — это статические фабричные методы для создания объектов Optional<T> в Java, но с критически важным отличием в обработке null.

Optional.of(value)

  • Требует гарантированно не-null значения.
  • Если передать null, немедленно выбрасывает NullPointerException.
  • Используется, когда вы уверены, что значение существует (например, результат валидного вычисления).
// Пример корректного использования
String userName = getUserNameFromDatabase(); // Предполагаем, что метод не возвращает null
Optional<String> opt = Optional.of(userName); // Безопасно, если предположение верно

// Пример, который вызовет исключение
Optional<String> badOpt = Optional.of(null); // NullPointerException!

Optional.ofNullable(value)

  • Принимает любое значение, включая null.
  • Если передан null, возвращает пустой Optional.empty().
  • Используется, когда значение может быть null (например, результат вызова внешнего API или чтения поля объекта).
// Пример обработки потенциально null-значения
String apiResponse = callExternalService(); // Может вернуть null
Optional<String> safeOpt = Optional.ofNullable(apiResponse); // Никогда не выбросит NPE
// safeOpt будет либо Optional[response], либо Optional.empty

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

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

Ответ 18+ 🔞

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

Optional.of(value) — это как строгий отец-командир

Ты ему суёшь значение и говоришь: «Держи!». А он такой: «А оно точно не null? А то я сейчас начну орать». И если ты ему сунешь null, он тебе сразу в лицо NullPointerException кинет. Ёпта, сразу драма, программа падает, всё, пиши пропало.

Используется это только тогда, когда ты на 150% уверен, что в твоих руках не пустота. Например, ты только что создал новый список List<String> list = new ArrayList<>() и пытаешься его запаковать. Ну тут понятно, список-то есть, он просто пустой.

String userName = "Васян"; // Вот тут имя есть, ваще без вопросов
Optional<String> opt = Optional.of(userName); // Всё ок, коробочка с "Васяном" внутри

А вот если начудишь:

Optional<String> badOpt = Optional.of(null); // Всё, пиздец. Тут же вылетит NPE.

Сам от себя охуел? Зачем null сувать туда, где его не ждут? Вот за это и бьют.

Optional.ofNullable(value) — это понимающий чувак

Он по жизни готов ко всему. Ты ему передаёшь что угодно. Значение есть? Отлично, кладём в коробочку. Передал null? Да похуй, спокойно так, без истерик, вернёт тебе пустую коробочку (Optional.empty()). Всё, тихо, мирно, никаких скандалов.

Это твой главный инструмент, когда работаешь с чем-то, что может быть, а может и не быть. Типа результат запроса к базе, чтение поля у объекта, который хрен знает откуда приплыл.

String apiResponse = callShittyExternalAPI(); // Может вернуть строку, а может и null
Optional<String> safeOpt = Optional.ofNullable(apiResponse); // Никакого пиздеца не будет!
// Теперь safeOpt либо с данными, либо пустой. Всё чики-пуки.

Так когда что юзать? Коротко и ясно:

  • Optional.of() — когда null — это ошибка, баг, пиздец. Если в этот момент у тебя null, значит, где-то выше по коду косяк, и надо не молча его проглатывать, а громко и чётко об этом заявить (исключением). Это как крик: «Чувак, тут нихуя нет, но по твоей же логике должно быть! Иди фиксь!».
  • Optional.ofNullable() — когда null — это легальное, ожидаемое состояние «значения нет». Ну не нашли пользователя в базе, хуле. Не пришёл ответ от сервиса. Окей, тогда у нас будет пустая коробочка, и дальше по коду мы это обработаем.

Проще запомнить: Если сомневаешься даже на один процент — юзай ofNullable(). А of() — это для ситуаций, где появление null вызывает у тебя удивление пиздец и желание всех послать.