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

«В чем разница между Optional.of() и Optional.ofNullable() в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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() — для обработки легальных случаев отсутствия значения. Это вопрос: "значение может быть, а может и не быть".