🎁 Optional: Лекарство от NullPointerException
Тони Хоар назвал изобретение
В Java 8 появился
📦 Что внутри?
Представьте
🔴 В ней может лежать объект (Non-empty).
🔴 Или она может быть пустой (Empty).
Главное правило: Никогда не возвращайте
🚫 Как делать НЕ надо
Самая частая ошибка новичка, использовать
Метод
✅ Как делать НАДО (Functional Style)
Вся мощь
1. Если значение есть, сделай что-то (
2. Если значения нет, верни дефолт (
3. Если значения нет — брось ошибку (
4. Преобразование внутри коробки (
Допустим, нам нужен не сам юзер, а его email. Если юзера нет, то и email нет.
⚡ Золотые правила использования
1. Только для возвращаемых значений! Не используйте
2.
🔴
🔴
🔥 Итог
Забудьте про
#Java #Optional #CleanCode #NoMoreNPE
📲 Мы в MAX
👉@BookJava
Тони Хоар назвал изобретение
null своей "ошибкой на миллиард долларов". NullPointerException (NPE) - самый частый кошмар Java-разработчика.В Java 8 появился
Optional<T> - класс-обертка, который явно говорит: "Здесь значения может и не быть".📦 Что внутри?
Представьте
Optional как коробку.Главное правило: Никогда не возвращайте
null из метода, если можно вернуть Optional.empty().🚫 Как делать НЕ надо
Самая частая ошибка новичка, использовать
Optional как старый добрый if (x != null):
Optional<User> userOpt = findUser("Alex");
// ❌ ПЛОХО: Это тот же null-check, только сложнее
if (userOpt.isPresent()) {
System.out.println(userOpt.get().getName());
}
Метод
.get() - это зло. Если коробка пуста, он бросит NoSuchElementException, и вы просто поменяли шило (NPE) на мыло.✅ Как делать НАДО (Functional Style)
Вся мощь
Optional раскрывается, когда вы строите цепочки вызовов, как в стримах.1. Если значение есть, сделай что-то (
ifPresent)
findUser("Alex").ifPresent(user -> System.out.println(user.getName()));
2. Если значения нет, верни дефолт (
orElse)
// Вернет юзера или создаст нового "Guest", если не нашел
User user = findUser("Alex").orElse(new User("Guest"));
3. Если значения нет — брось ошибку (
orElseThrow)
User user = findUser("Alex")
.orElseThrow(() -> new IllegalArgumentException("User not found"));
4. Преобразование внутри коробки (
map)Допустим, нам нужен не сам юзер, а его email. Если юзера нет, то и email нет.
String email = findUser("Alex")
.map(User::getEmail) // Достаем email (если юзер есть)
.map(String::toUpperCase) // В верхний регистр (если email был)
.orElse("UNKNOWN"); // Если хоть на одном этапе было пусто
⚡ Золотые правила использования
1. Только для возвращаемых значений! Не используйте
Optional как тип поля в классе или аргумент метода. Это лишний оверхед и мусор в коде.2.
orElse() vs orElseGet():orElse(new Object()) - объект создается всегда, даже если он не нужен.orElseGet(() -> new Object()) - объект создается только если в коробке пусто (лениво). Используйте этот вариант для тяжелых объектов.🔥 Итог
Optional спасает не тем, что убирает null, а тем, что заставляет вас явно обработать случай отсутствия значения.Забудьте про
.get(). Используйте .map(), .filter() и .orElse().#Java #Optional #CleanCode #NoMoreNPE
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥2