Эффективный обзор Java (Серия из 79 частей)
До Java 8, если метод не хотел возвращать значение некоторое время и возвращать значение в другое время, было несколько вариантов. Метод может возвращать null
, метод может выдать исключение, или вы можете придумать какой-нибудь объект, удерживающий состояние, который можно было бы вернуть (хотя я никогда этого не видел). Первые два варианта не очень хороши. Возврат нулей
просто запрашивает исключения нулевого указателя. Выбрасывание исключений – это чрезвычайно тяжелая работа, медленная и болезненная, с которой приходится иметь дело. В Java 8 язык предоставил стандартный способ использования третьего варианта с введением Необязательного
класса. Концептуально Необязательный
– это неизменяемая коллекция, которая может содержать не более одного элемента. Хотя на самом деле он не реализует интерфейс Collection
, он мог бы. В дополнение к этому поведению, связанному с состоянием, у него также есть ряд полезных методов, которые действительно делают его полезным.
В предыдущей главе мы говорили о методе, который мог бы рассчитать максимальное значение в коллекции.
public static> E max(Collection collection) { if (collection.isEmpty()) { throw new IllegalArgumentException("Empty collection"); } E maximumValue = null; // Insert business logic for calculating maximum return maximumValue. }
Описанный выше метод использует позицию исключения, когда ему нечего возвращать. Мы можем отказаться от этого и вместо этого перейти к использованию необязательного.
public static> Optional max(Collection collection) { E maximumValue = null; // Insert business logic for calculating maximum return Optional.ofNullable(maximumValue). }
Как мы видим выше, это на самом деле даже упрощает код. Если Optional.ofNullable
передается значение null, оно вернет то же самое, что и Optional.empty()
и если ему будет передан конкретный объект, он вернет объект, завернутый в Необязательный
(это также можно сделать вручную с помощью Необязательно.из( )
, он просто не выполняет проверку null
для вас).
Следует отметить, что Необязательный
– это просто другой класс, и поэтому вы можете возвращать null
из методов, которые возвращают Необязательный
. Хотя язык позволяет это, к сожалению, вы не должны этого делать . Это разрушает суть Необязательный
и вы теряете всякую веру в авторов кода, которые это делают.
Еще одна интересная вещь заключается в том, что Потоки
и Необязательно
вводили язык одновременно. В этом случае в API Streams
существует множество операций терминала, которые возвращают Необязательно
. Используя это, мы действительно можем сделать нашу функцию max
еще более лаконичной.
public static> Optional max(Collection collection) { return collection.stream().max(Comparator.naturalOrder()); }
Весь наш метод превратился в однострочный.
Еще одна вещь, которую вы можете обнаружить, работая с Необязательными
методами возврата, заключается в том, что они имеют тот же дух, что и проверенные исключения. Это происходит потому, что они заставляют вызывающего ваш метод столкнуться с возможностью пустого значения. Хотя я не поклонник проверенных исключений, я поклонник Необязательно
. Сталкиваясь с этим фактом, я думаю, что это происходит по двум причинам. 1. Необязательные
менее инвазивны в работе. 2. Дополнительные функции предоставляют функции, которые очень полезны при работе с потенциальной пустотой, которые выводят их за рамки простых держателей состояния.
Как насчет этих методов, о которых я говорю? Существует множество таких функций, и я не могу охватить их все, но они варьируются от простых вещей, таких как присутствует()
и Орельсе(E)
для более забавных вещей, таких как карта()
. Когда вы используете Необязательно
, вы обнаруживаете эти методы, и они действительно могут изменить способ вашего программирования, очень похожий на Потоки
. Хотя обычно проще всего использовать если присутствует()
с места в карьер, я призываю вас попробовать использовать более мощные методы и посмотреть, как это работает для вас.
Итак, когда не следует использовать Опции
. Одним из случаев может быть использование уже существующего класса контейнера, такого как коллекция. В этих случаях просто верните пустую коллекцию, как обсуждалось в нашей предыдущей части этой серии. Честно говоря, это главная причина, по которой я бы не стал использовать Необязательный
с методом, который может возвращать пустой результат.
Создание Необязательно
объекты действительно имеют стоимость, как и создание любого объекта. Это особенно распространено в коробочных типах. Именно по этой причине для них существуют специальные версии Optional
( OptionalInt
, OptionalLong
и т. Д.). При взаимодействии с этими типами всегда используйте специализированный Необязательный
тип.
В качестве заключительного пакета с предметами для рассмотрения давайте рассмотрим некоторые заключительные мысли. Почти никогда нецелесообразно использовать Необязательный
в качестве ключа к объекту. Кроме того, использование Необязательного
в качестве параметра является небольшим. В этих случаях вы, скорее всего, просто захотите перегрузить метод и предоставить оба варианта передачи параметра, а не.
На мой взгляд Необязательный
были отличным дополнением к языку. Хотя в некоторых других языках существуют более мощные эквивалентные типы, я думаю, что этот класс отлично справляется с чем-то, добавленным в язык так поздно. Надеюсь, этот обзор главы даст вам немного больше уверенности при использовании Необязательно
.
Эффективный обзор Java (Серия из 79 частей)
Оригинал: “https://dev.to/kylec32/effective-java-return-optionals-judiciously-129o”