Optional — супер удобный инструмент, который появился в java 8. В документации его цель явно обозначена — показать, что результат вызова метода может отсутствовать.Например, функция поиска может найти нужный элемент, а может и не найти. В этой ситуации отлично подойдёт
Optional:Optional<String> search();
С виду всё просто и понятно.
Тем не менее, на практике
Optional часто используется некорректно, код получается сложным или плохо читаемым. Самые популярные ошибки:1️⃣ Использовать Optional во входных параметрах и конструкторах
❌ void init(Optional<String> value) {…}
Приходится добавлять лишние обёртки и проверки.
✅ Лучше проверять параметры на null в начале метода:
void init (String value) {
if (value == null) …
}2️⃣ Возвращать Optional при наличии дефолтного значения
❌ return Optional.ofNullable(value).orElse("default");
✅ return value == null ? "default" : value;3️⃣ Обрабатывать Optional не сразу
и тащить его далеко по коду. Идеально, если обработка происходит сразу после возвращения из метода:
Optiona<String> valueOpt = …
String value = valueOpt.orElse("default");
4️⃣ Возвращать Optional для коллекций
❌ public Optional<List<Integer>> search(…)
Если элементов нет, верните пустой список:
✅ public List<Integer> search(…) {
… return List.of();
}5️⃣ Неоптимальная работа с примитивами
Для int, long и double есть специальные классы:
OptionalInt, OptionalDouble и OptionalLong.У них нет затрат на создание объекта, а код становится чуть короче и понятнее. Методов меньше, чем в классическом Optional, но при интенсивной работе с примитивами возможен прирост производительности.
Ответ на вопрос перед постом
Входные параметры лучше проверять внутри метода:
❌ List<Student> search(Optional<String> city)
❌ void init(Optional<String> conf)
Лучше вернуть пустой список, если элементов нет:
❌ Optional<List<Student>> all()