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