Рубрики
Без рубрики

Эффективная Java! Возвращайте Варианты Разумно

Погружение в главу 54 “Эффективная Java”. Помеченный как java, эффективный, необязательный, архитектура.

Эффективный обзор 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”