Статья подготовлена для студентов курса «Разработчик Java» в образовательном проекте OTUS.
В программировании часто возникает задача вернуть из функции какое-нибудь значение. Причём это значение может быть, а может и не быть. Например, функция обращается к таблице базы данных и выбирает некоторое значение по ключу. Это значение может найтись, а может и не найтись.
Что делать со значением понятно – его надо просто вернуть. А что делать, если значения в таблице нет?
Рассмотрим варианты действий
Итак, у нас есть несколько вариантов:
Можно устанавливать специальный код ошибки, а потом его проверять. Такой подход широко практиковался в языке Си. Понятно, что сейчас это выглядит более чем странно.
Другой вариант – выбрасывать исключение типа VALUE_NOT_FOUND. Вариант популярный, но тоже с кучей недостатков. Начнём с типа исключения. Оно должно быть checked? Тогда его надо будет декларировать и дальше за собой таскать, сейчас это как минимум не модно. Если Unchecked, то как сообщить клиентскому коду, что может быть такие исключение и это фактически часть бизнес-логики?
Реализовывать бизнес-логику на исключениях тоже вариант ниже среднего. Поэтому, часто в таких случаях, если значение не найдено, возвращают просто null. Казалось бы, это годное решение. Однако работа с null-ами – так себе удовольствие. Надо постоянно думать про NullPointerException. Все решения какие-то несуразные.
Какие есть ещё варианты?
В ряде языков программирования эта проблема решается при помощи так называемой Null-монады. Есть такая возможность и в java. Давайте с ней познакомимся.
Допустим, у нас есть функция, которая может возвращать или строку или Null:
Раскомментируйте нужную строку, чтобы получить нужный вариант.
Как может выглядеть код, в котором будет использоваться эта функция?
Примерно так:
В принципе, получился нормальный, рабочий вариант, который часто встречается на практике. Выглядит он громоздко, некрасиво. Более того, если вместо System.out.println мы захотим передавать значение в другие функции, то нам надо будет всегда помнить про возможность null, т. е. всегда делать проверку типа if (value == null), это очень неудобно и легко забыть.
Давайте перепишем этот пример с использованием null-монады. В java эта концепция реализуется через класс Optional.
И как с этим работать:
Обратите внимание, что в этом случае у нас нет if-условия. Т. е. у нас нет шанса забыть про обработку значений и неожиданно получить NPE-исключение. Да и сама запись получилась более компактная, красивая и современная.
В следующей части мы посмотрим на некоторые моменты использования Optional, не пропустите!
Материал подготовлен для студентов курса «Разработчик Java» в образовательном проекте OTUS. Чтобы присоединиться к ближайшей группе, обязательно пройдите вступительное тестирование:
ПРОЙТИ ТЕСТИРОВАНИЕ