Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
@bookjava
Фото 🎁 Optional: Лекарство от NullPointerException Тони Хоар назвал изобретение null своей "ошибкой на миллиард долларов". NullPointerException (NPE) - самый частый кошмар Java-разработчика. В Java 8 появился Optional<T> - класс-обертка, который явно говорит: "Здесь значения может и не быть". 📦 Что внутри? Представьте Optional как коробку. 🔴 В ней может лежать объект (Non-empty). 🔴 Или она может быть пустой (Empty). Главное правило: Никогда не возвращайте 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
Если у вас установлено приложение,
вы можете сразу перейти в канал