Документация JDK 20 — Главная

  1. Главная
  2. Ява
  3. Java SE
  4. 20

Обзор

  • Прочтите меня
  • Примечания к выпуску
  • Что нового
  • Руководство по миграции
  • Загрузить JDK
  • Руководство по установке
  • Формат строки версии

Инструменты

  • Технические характеристики инструментов JDK
  • Руководство пользователя JShell
  • Руководство по JavaDoc
  • Руководство пользователя средства упаковки

Язык и библиотеки

  • Обновления языка
  • Основные библиотеки
  • HTTP-клиент JDK
  • Учебники по Java
  • Модульный JDK
  • Руководство программиста API бортового регистратора
  • Руководство по интернационализации

Технические характеристики

  • Документация API
  • Язык и ВМ
  • Имена стандартных алгоритмов безопасности Java
  • банок
  • Собственный интерфейс Java (JNI)
  • Инструментальный интерфейс JVM (JVM TI)
  • Сериализация
  • Проводной протокол отладки Java (JDWP)
  • Спецификация комментариев к документации для стандартного доклета
  • Прочие характеристики

Безопасность

  • Руководство по безопасному кодированию
  • Руководство по безопасности

Виртуальная машина HotSpot

  • Руководство по виртуальной машине Java
  • Настройка сборки мусора

Управление и устранение неполадок

  • Руководство по устранению неполадок
  • Руководство по мониторингу и управлению
  • Руководство по JMX

Client Technologies

  • Руководство по специальным возможностям Java

Рассмотрены методы Void Anti-Pattern — DZone

Сегодняшняя тема сильно отличается от всех моих предыдущих тем. Сегодня я выпущусь и, надеюсь, спровоцирую дискуссию, по крайней мере, в комментариях, об использовании методов void в нашем коде и о том, следует ли считать их запахом кода. Я расскажу о некоторых основах ключевого слова void и упомяну случаи, когда мы можем счесть полезным использовать методы с этим ключевым словом. Затем я приведу аргументы, чтобы показать вам, что, в конце концов, это может оказаться не такой уж хорошей идеей.

Но сначала имейте в виду, что этот текст написан с точки зрения языка Java, и в некоторых случаях он может быть неприменим к вашему любимому языку.

Ключевое слово Void Назначение

Как и любое другое ключевое слово,  void имеет причину для существования — или, по крайней мере, кажется. В Java, как и в других языках, производных от C, он используется для описания методов, которые выполняются нормально, но не предоставляют возвращаемое значение вызывающей стороне.

Стоит отметить, что в Java, наряду с ключевым словом void , у нас есть тип Void , который используется для  представления возвращаемого типа void в виде класса. Он имеет только закрытый конструктор, поэтому мы не можем создать его экземпляр. Кроме того, единственное значение, которое мы можем присвоить переменной Void , это null .

Когда и зачем нам могут понадобиться методы Void?

В большинстве случаев мы используем методы void, когда нам нужно выполнить операцию с какими-то побочными эффектами. Наиболее распространенный вариант использования методов void — 9.0123  System.out.println , который выводит нужный текст на стандартный вывод.

Другие примеры:

  • Запуск задания или задачи, например запуск приложения Java с помощью основного метода
  • Выполнение запроса к базе данных
  • Использование аннотации жизненного цикла компонента, например @PostCon s truct
  • Сеттеры для свойств вашего объекта по умолчанию пусты

Кроме того, некоторые библиотеки или API-интерфейсы, с которыми вам необходимо интегрироваться, используют методы void, и, соответственно, вам также необходимо их использовать. библиотека javax.mail может быть хорошим примером. Его самый важный метод,

SendMessage , является void, поэтому, даже если вы предпочитаете не использовать void самостоятельно, вас все равно могут заставить это сделать.

О том, почему мы используем методы void — как обычно, зависит. Например, в случае печати может быть сложно придумать, что именно нужно вернуть. То же самое верно и для запуска заданий или задач, но здесь дело обстоит сложнее. Для аннотаций жизненного цикла они ничего не могут вернуть. Это просто простые хуки и все, даже если мы решим что-то вернуть из такого метода, это все равно будет пропущено.

Как видите, методы void кажутся довольно полезными, так что теперь у вас может возникнуть соблазн спросить: почему именно я считаю, что мы должны избегать их, если они так полезны? – и, как обычно, я здесь, чтобы помочь вам и дать ответ.

Почему использование методов Void — плохая идея?
Пустые методы:
  1. Прерывание инкапсуляции может привести к утечке некоторых ненужных деталей реализации нашего приложения. Кроме того, это может привести к необходимости более глубоких знаний о системе от всех, кто заинтересован в содействии или решении некоторых задач, связанных с приложением. Это может быть не так для относительно простой кодовой базы, но она наверняка продемонстрирует всю свою «славу» в более крупном приложении. Тем не менее, я уверен, что почти каждый из нас забыл вызвать такой метод, как 9.0123 public void

    doSth(..arguments) и потратил час или около того на размышления «почему мой код не работает?».

  2. Не заключайте никаких контрактов, с точки зрения того, что у нас есть ввод и вывод, у нас есть только ввод, а после ввода у нас есть магия. Мы должны угадать, что именно происходит внутри метода. На мой взгляд, это самая большая проблема с методами void. Вы можете заметить, что это является причиной всех других проблем, описанных ниже, по крайней мере, в какой-то части.

  3. Может ограничивать локальные рассуждения, поскольку вы теряете информацию о том, что на самом деле возвращает метод. Вы должны погрузиться в реализацию, чтобы узнать об ожидаемом результате выполнения метода. Конечно, описательное наименование может уменьшить влияние этой проблемы, но, тем не менее, обычные методы предоставляют больше информации, и что еще более важно, эта информация более видна для читателя.

  4. Значительно сложнее проверить. Отсутствие возвращаемого значения делает невозможным выполнение любых тестов на основе утверждений, известных из таких библиотек, как 9.0123 J U нит . Чтобы убедиться, что наш метод работает должным образом, нам нужно будет проверить состояние объекта, который он изменяет (простой случай), или состояние некоторой тестовой базы данных, которая играет роль производственного аналога (сложный случай). Это может стать еще хуже, когда мы вынуждены использовать такие методы, как .spy() (что само по себе стоит аналогичной статьи), из библиотек, таких как M ockito , для проверки правильности внутренней работы конкретного метода.

  5. Жить только благодаря побочным эффектам (еще один полуантипаттерн, особенно в функциональном программировании). Если вы хотите избежать или ограничить их в своей кодовой базе, вам также следует держаться подальше от ключевого слова void .

  6. Имеет тенденцию очень быстро распространяться по кодовой базе, потому что это выглядит как более простой и быстрый способ реализовать то, что нам нужно.

Выше вы можете найти несколько полезных советов по подготовке хорошего спагетти-кода. Если говорить серьезно, это мои фундаментальные аргументы против использования методов void. Если вы не согласны с каким-либо из них или у вас есть другие аргументы в поддержку моей точки зрения, я приглашаю вас в раздел комментариев к этой статье для культурного обсуждения этой темы.

Поскольку мы постепенно приближаемся к концу сегодняшнего чтения, есть еще один важный вопрос.

Все ли методы Void плохи?

Конечно нет, но большинство из них. Такие задачи, как печать на консоль, запись в файл или отправка почты, являются хорошими примерами того, когда можно использовать методы void, не вызывая слишком много проблем. Однако почти в любом другом случае их следует избегать и использовать как можно более ограниченно, по крайней мере, на мой взгляд.

Если ограничение использования пустот невозможно, следует сосредоточиться на ограничении их влияния на общее приложение. Например, вы можете поместить их как можно ниже в порядке выполнения. Следовательно, любой сбой такого метода может быть лучше изолирован, и общее влияние на стиль и внутреннюю работу нашей кодовой базы будет уменьшено.

Резюме

Я повторю еще раз, просто чтобы прояснить: в большинстве случаев методы void плохи и должны рассматриваться как анти-шаблоны, их использование может привести к очень изящному спагетти-коду, в котором все неявно сохраняет состояние.

Я представил свое мнение об использовании методов void и, надеюсь, ясно объяснил, почему я так думаю.