Какие способы применения Optional считаются антипаттернами?
Антипаттерны: 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 ведёт себя при сериализации?
Разбор темы
- Optional: явное отсутствие значения
Зачем Optional, orElse против orElseGet, композиция map/flatMap/filter и антипаттерны использования.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.