TGViewer
Библиотека Java разработчика Библиотека Java разработчика @bookjava · 10.1K subscribers
Post #4139 1.35K
🎁 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

📲 Мы в MAX

👉@BookJava
  • 👍 6
  • ❤ 5
  • 🔥 2
More from @bookjava
  1. Sep 30, 2026Три похожих слова в Java — final, finally, finalize — но смысл у них совершенно разный. Ра…
  2. Sep 27, 2026🧠 Ленивая инициализация через Supplier — элегантная альтернатива double-checked locking К…
  3. Sep 23, 2026Что такое механизм try-with-resources? Механизм try-with-resources в Java — это конструкци…
  4. Sep 21, 2026📌 picocli — это современная библиотека для создания CLI-приложений на Java. Она упрощает…
  5. Sep 18, 2026Double-brace инициализация в Java — это идиома, которая используется для инициализации кол…
  6. Sep 16, 2026🧠@Value vs @ConfigurationProperties — не выбирай наобум Оба способа хороши для конфигурац…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →