2.2Kпросмотров
31.7%от подписчиков
3 февраля 2026 г.
Score: 2.4K
🎭 Optional.ofNullable() - как не стрелять себе в ногу NullPointerException Кажется, что Optional должен спасать от null. Но если перепутать Optional.of() с Optional.ofNullable() - получишь NPE там, где меньше всего ожидал. Это как заряжать пистолет, думая, что он игрушечный. Вот разбор, как не попасть в эту ловушку и когда что использовать 👇 📂 Шаг 1: В чём разница? (Одно слово - null) // Если value == null, то:
Optional.of(value); // 🚨 Выбросит NPE
Optional.ofNullable(value); // ✅ Вернёт Optional.empty()
➡️ Optional.of создаёт контейнер только для не-null значений. Optional.ofNullable - для любых, сам проверит и сделает empty() при null. 📂 Шаг 2: Где стреляет Optional.of() (реальный пример)
Представь, что метод может вернуть null, а ты оборачиваешь результат в Optional для красоты: String findNameById(Long id) { // ... какой-то поиск, который может вернуть null
} // Где-то в коде:
Optional<String> name = Optional.of(findNameById(42)); // БАМ! NPE
➡️ Кажется, что ты делаешь «безопасный» контейнер, но of() выстрелит раньше, чем ты успеешь его использовать. Типичная ошибка при рефакторинге старого кода. 📂 Шаг 3: Правильный паттерн для оборачивания неизвестных значений // Входящее значение может быть null -> только ofNullable
Optional<String> safeName = Optional.ofNullable(findNameById(42)); // Теперь можно безопасно работать
String result = safeName.orElse("По умолчанию");
➡️ ofNullable - это шлюз, который пропускает и null, и значение, превращая первое в empty(). 📂 Шаг 4: А когда тогда нужен Optional.of()?
Только когда ты на 100% уверен, что значение не null. Например: // Константы, финальные строки
Optional<String> env = Optional.of("PROD"); // Результаты методов, которые никогда не возвращают null по контракту
Optional<String> uuid = Optional.of(UUID.randomUUID().toString());
➡️ Используй of() как assertion - «это точно не null». Если сомневаешься - ofNullable. 📂 Шаг 5: Тест на внимательность public Optional<String> extract(boolean flag) { String value = flag ? "Java" : null; return Optional.of(value); // Что будет при flag = false?
}
➡️ Правильно - NPE при вызове метода, а не пустой Optional. Эту ошибку компилятор не подскажет. 🗣 Запомни: Optional.of() - это крик «я уверен!». Если не готов ловить NPE, как пулю, всегда используй ofNullable.