Существует ли соглашение Java для возврата true, false или unknown? - PullRequest
3 голосов
/ 07 октября 2011

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

Раньше я просто делал метод, который возвращает boolean. Но теперь, чтобы приспособиться к исключениям, я думаю передать true или false в аргументах функции и использовать возвращаемое значение в качестве индикатора успеха или неудачи для теста.

Является ли это «правильным и распространенным» способом сделать это в Java? Или что-то еще распространено в Java для достижения этой цели?

Ответы [ 4 ]

7 голосов
/ 07 октября 2011

Ваш метод должен вернуть логическое значение и выдать Исключение , если ресурсы недоступны.

3 голосов
/ 07 октября 2011

Я бы определенно заставил метод генерировать исключение, если он не может рассчитать правильный ответ.

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

В этом случае вызывающая сторона может определить вероятность ошибки:

class C1 {
  public boolean canCalculateResultNow() { ... }
  public boolean calculateResult() {
    if (cannot get resource) throw new IllegalStateException("Cannot get resource");
    ...
  }
}

Теперь вот что я сделаю, если вызывающая сторона не может быть уверена, что метод сможет нормально завершиться:

class CannotCalculateResultException extends Exception { ... }
class C2 {
  public boolean calculateResult() throws CannotCalculateResultException {
    if (cannot calculate result) throw new CannotCalculateResultException();
    ...
  }
}

Еще одна возможность, которая мне действительно не нравится иНастоятельно не рекомендуется, чтобы метод возвращал Boolean, который является обнуляемой версией boolean.A Boolean может быть true, false или null.Затем вы можете заставить метод возвращать null, если ресурс недоступен.

Основная проблема, которую я вижу в этом подходе, заключается в том, что значение null может быть неясным.Вызывающий код всегда должен проверять, является ли результат нулевым, и разработчику (возможно, даже вам самим через несколько месяцев после написания этого кода) придется прочитать документацию метода, чтобы узнать, что означает нулевой результат.Конкретное проверенное исключение дает понять, что что-то может пойти не так, а что - нет.Кроме того, это заставило бы разработчика подготовиться к делу, в котором что-то пошло не так.При подходе с непроверенными исключениями наличие метода canCalculateResult() также будет указывать разработчику, использующему класс, что что-то может пойти не так, без необходимости читать документацию, и разумно предположить, что это что-то «опасное»."звонить calculareResult() без первого звонка canCalculateResult().

1 голос
/ 07 октября 2011

Я бы предложил другой подход: верните не boolean, а Boolean и верните true/false, когда есть ресурсы, и верните null, когда ресурсов нет

0 голосов
/ 07 октября 2011

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

...