Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования