Ответ 1
Итак, что не так с необязательным?
Вопрос, с которым мы сталкиваемся: будет ли JDK 8 Необязательные объекты избавляться от нулевых ссылок? И ответ - решительный нет! Таким образом, хулители сразу же задают вопрос о его значении: тогда что хорошо для того, что мы уже не могли сделать другими способами?
В отличие от функциональных языков, таких как SML или Haskell, которые никогда не имели понятия нулевых ссылок, в Java мы не можем просто избавиться от нулевых ссылок, которые исторически существовали. Это будет продолжать существовать, и они, возможно, имеют их правильное использование (просто упомянуть пример: трехзначная логика).
Я сомневаюсь, что намерение с классом "Необязательно" заключается в замене каждой единственной ссылочной ссылки, но на помощь в создании более надежных API-интерфейсов, в которых, просто прочитав подпись метода, мы могли бы сказать, можем ли мы ожидать дополнительного значения или нет, и заставить программиста использовать это значение соответствующим образом. Но в конечном счете, Необязательный будет просто еще одной ссылкой и с учетом тех же недостатков любой другой ссылки на языке (например, вы можете вернуть null Необязательный). Совершенно очевидно, что опция не будет экономить день.
Как эти необязательные объекты предполагается использовать или они ценны или нет в Java, это вопрос жаркие споры в список рассылки лямбда проекта. От хулителей мы слышим интересные аргументы вроде:
- Тот факт, что существуют другие альтернативы (например, IDES, такие как IntelliJ и Eclipse IDE, поддерживают набор проприетарных аннотаций для статического анализа неопределенности, JSR-305 с аннотациями вроде @Nullable и @NonNull).
- Некоторым хотелось бы, чтобы он был полезен, как в функциональном мире что не совсем возможно на Java, поскольку на этом языке не хватает многих функций, существующих в языках функционального программирования, таких как SML или Haskell (например, сопоставление образцов).
- Другие утверждают, что невозможно использовать модифицировать существующий код для использования этой идиомы (например, List.get(Object), который будет продолжать return null).
- И некоторые жалуются на то, что отсутствие поддержки языка для необязательных значений создает потенциальный сценарий, в котором необязательно используется непоследовательно в API, создавая несовместимости, в значительной степени похожи на те, которые мы будем использовать с остальной частью Java API, которые не могут быть модифицированы для использования нового Необязательного класса. Это в значительной степени ваш вопрос здесь. В языках с поддержкой дополнительных типов как на Цейлоне или как в Котлине, вы даже не ставите под сомнение это.
- Привлекательный аргумент состоит в том, что если программист вызывает метод get в необязательном объекте, если он пуст, он будет вызывать исключение NoSuchElementException, что в значительной степени та же проблема, что и у нас с нулями, только с другим исключением.
Таким образом, очевидно, что преимущества Необязательного являются действительно сомнительными и, вероятно, ограничены для улучшения удобочитаемости и обеспечения соблюдения контрактов с открытым интерфейсом.
Я действительно считаю, что принятие этой необязательной функциональной идиомы, скорее всего, сделает наш код более безопасным, менее оперативным для устранения проблем с разыменованием и, как следствие, более надежным и менее подверженным ошибкам. Конечно, это не идеальное решение, потому что, в конце концов, необязательные ссылки также могут быть ошибочно установлены на нулевые ссылки, но я ожидаю, что программисты придерживаются соглашения о том, что не передают нулевые ссылки, где ожидается дополнительный объект, мы сегодня считаем хорошей практикой не передавать нулевую ссылку, где ожидается сбор или массив, в этих случаях правильным является передача пустого массива или коллекции. Дело здесь в том, что теперь у нас есть механизм в API, который мы можем использовать для того, чтобы сделать явным, что для данной ссылки у нас может не быть значения для ее назначения, и пользователь вынужден API-интерфейсом проверить это.
Цитата статья Google Guava об использовании необязательных объектов:
"Помимо увеличения читаемости, получаемой от дачи null имя, наибольшее преимущество Необязательного - его идиот-доказательство. Это заставляет вас активно думать о отсутствующем случае, если вы хотите программы для компиляции вообще, так как вы должны активно разворачивать Необязательно и адресуйте этот случай".
Итак, я догадываюсь, что каждому дизайнеру API нужно выбрать, как далеко они захотят использовать опцию.
Некоторые влиятельные разработчики, такие как Стивен Колеборн и Брайан Гетц, недавно опубликовали несколько интересных статей о правильном использовании необязательного. Я особенно нашел полезным следующее: