【问题标题】:Is there a Java convention for returning true, false, or unknown?是否有返回 true、false 或 unknown 的 Java 约定?
【发布时间】:2011-12-02 17:52:41
【问题描述】:

我正在编写一个方法,如果某事为真或不正确,该方法将返回。但如果测试条件所需的资源不可用,则无法返回true或false。

之前,我只是将其设为返回 boolean 的方法。但是现在,为了适应异常,我正在考虑在函数参数中传递 true 或 false,并将返回值用作测试的成功或失败指示符。

这是在 Java 中“正确且常见”的方式吗?还是 Java 中流行的其他东西来实现这一点?

【问题讨论】:

  • 你能提供更多的上下文吗?现在听起来你想要一个带有检查或未检查异常的布尔返回值......但很难确定。
  • 只返回true或false并在失败的情况下抛出异常有什么问题?
  • 反转:如何做到这一点:thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
  • 您不能在 Java 中传递对 boolean 的引用,如果这就是您的意思,“在函数参数中传递真/假”。您可以获得的最接近的方法是传递一些可变对象并对其进行修改。

标签: java exception return-value idioms


【解决方案1】:

如果资源不可用,您的方法应返回布尔值并抛出 Exception

【讨论】:

  • 这是正确的,前提是资源不可用是一种例外情况。如果是正常且预期的状态,则异常是不合适的。
【解决方案2】:

如果无法计算出正确答案,我肯定会让该方法抛出异常。

现在您必须决定是否检查或取消检查抛出的异常。这真的取决于上下文。通常,我是这样想的:如果调用者有办法确保方法不会失败,我会让它抛出未经检查的异常;否则,如果调用者无法绝对确定该方法不会失败,那么我会将其设为已检查异常。

这将是调用者可以确定失败可能性的情况:

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可为空 版本。 Boolean 可以是 truefalsenull。然后,如果资源不可用,您可以让该方法返回 null

我在这种方法上看到的主要问题是null 的含义可能不清楚。调用代码总是必须检查结果是否为空,而开发人员(甚至可能是您在编写此代码几个月后)必须阅读方法的文档以了解空结果的含义。一个特定的检查异常清楚地表明可能会出错以及可能出错的地方。此外,这将迫使开发人员为出现问题的情况做好准备。在带有未经检查的异常的方法上,方法canCalculateResult() 的存在也会向使用该类的开发人员指示可能会出错,而无需阅读文档,并且可以合理地假设它是“危险的” " 无需先调用 canCalculateResult() 即可调用 calculareResult()

【讨论】:

    【解决方案3】:

    我会提出其他方法:不是返回boolean,而是返回Boolean,有资源时返回true/false,没有资源时返回null

    【讨论】:

      【解决方案4】:

      这是正确的,但不是一个好习惯。相反,如果无法计算答案,您的方法应该返回一个布尔值并处理异常

      【讨论】:

        猜你喜欢
        • 2017-06-29
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2019-12-17
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多