Возврат boolean вместо объявления типа void в Java?

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

Ответы

Ответ 1

Обычно я использую Exception, чтобы сигнализировать, когда что-то пошло не так.

Вместо возврата false вы можете throw a Exception с подробным сообщением о проблеме.

Возврат false не дает вам много информации о проблеме.

Затем вместо проверки для возвращаемого значения false просто введите вызов метода в try/catch, если вы ожидаете, что метод может легко выйти из строя.

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

Ответ 2

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

Если исключения кажутся отвратительными, вы можете вернуть пользовательский объект статуса, содержащий логическое и статусное сообщение (что-то вроде "Добавлено 6 новых Foobars!" или "Не удалось добавить Foobars, потому что Foobin полон!" ), хотя это конечно, более сложный.

Ответ 3

Делайте это только в сценариях, где ясно, что что-то имеет логический результат. Как IsValidCustomer() или некоторые такие.

Для всех остальных вещей, которые, по вашему мнению, вы можете представить, возможно, вы имеете дело с каким-то Exception, и вы действительно не хотите обертывать это с помощью простого логического true/false, потому что вы могут иметь различные вкусы (разные исключения) и причины, по которым что-то пойдет не так, о чем вы хотели бы знать.

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

Ответ 4

Используйте логические значения для указания неисключительных результатов отказа. Примером может служить функция поиска. Номинальный отказ не будет найден. Коммуникация этого результата с исключениями громоздка. Сохранить исключения для исключительных случаев; разница между не найденной и не может быть найдена.

Ответ 5

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

Этот шаблон действительно существует в основных библиотеках Java. В качестве примера см. File.delete().

Ответ 6

Для возврата успеха обычно видно, что вы видите:

  • Возвращает boolean
  • Возвращает void, но исключает исключение при ошибке
  • Возвращает код состояния (менее распространенный в java).

Невозможно увидеть что-то не так, возвращая логическое значение для успеха, если вам не нужна информация о поведении исключений.

Ответ 7

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

Ответ 8

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

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

Действительно, это два очень разных значения слова "ошибка", и они требуют различной обработки. Вполне возможно, что одна и та же функция может сделать и то, и другое. Например, при найденном возврате true, при не найденном возврате false, при ошибке ввода-вывода пытается прочитать throw exception.

Ответ 9

Кажется, хорошо, но дьявол лежит в деталях.; -)

Бросок исключения является основной альтернативой, с плюсами и минусами.

Я думаю, вы могли бы получить больше информации, предоставив точные образцы кодирования...