Получить доступ

Какие способы применения Optional считаются антипаттернами?

MiddleЛямбды и Stream API
Коротко

Антипаттерны: Optional как поле (не сериализуем, лишняя аллокация), как параметр (перекладывает проблему на вызывающего), голый get() без проверки, isPresent + get вместо map и orElse, Optional<List> вместо пустого списка, Optional.of(null) (NPE — нужен ofNullable).

  • Optional задумывался только как тип возвращаемого значения
  • Сравнение Optional через == ненадёжно
  • Возвращать null из метода с типом Optional — худшее из двух миров

А ещё JPA-сущности: геттер может возвращать Optional, поле — нет

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Замысел был узкий: дать методу способ явно сказать «результата может не быть», чтобы вызывающий не забыл про этот случай. Для полей он не подходит — класс не сериализуется, добавляется лишний уровень косвенности и аллокация на каждый объект. Для параметров он лишь перекладывает проблему: вызывающему теперь нужно оборачивать значение, а внутри всё равно возможен null вместо самого Optional. Вызов get() без проверки возвращает нас к NullPointerException, только под другим именем; современная альтернатива — orElseThrow(), которая говорит о намерении явно. Возврат же Optional из метода поиска — ровно то, ради чего он создавался.

Что хотят услышать

  • Перечень антипаттернов и почему они плохи.

Частые ошибки

  • Оборачивать в Optional поля DTO и сущностей.
  • Писать opt.isPresent() и следом opt.get() вместо ifPresent, map или orElseThrow.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Использовать Optional как тип поля сущности — он не сериализуем и задумывался не для этого
  • ✓Принимать Optional параметром метода вместо перегрузки или обычного значения
  • ✓Вызывать get() без предварительной проверки наличия значения
  • ✗Возвращать Optional из метода, который может не найти результат

Что спросят дальше

  • Чем orElseThrow лучше get()?
  • Как Optional ведёт себя при сериализации?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем