0

有效的 java 声明了私有方法中断言的良好实践。

“对于未导出的方法,作为包作者,您可以控制调用该方法的环境,因此您可以并且应该确保只传入有效的参数值。因此,非公共方法通常应该使用断言检查它们的参数,如如下图:

例如:

// Private helper function for a recursive sort
private static void sort(long a[]) {
    assert a != null;
    // Do the computation;
}

我的问题是,即使调用排序的公共函数有空指针检查,是否也需要断言?

例子:

public void computeTwoNumbersThatSumToInputValue(int a[], int x) {
    if (a == null) {
      throw new Nullptrexception();
    }
    sort(a);
    // code to do the required.
}

换句话说,在这种情况下,私有函数中的断言将是“多余的”还是强制性的。

谢谢,

4

3 回答 3

1

如果您确定在所有调用代码中都有断言,那将是多余的。在某些情况下,这是非常明显的——在其他情况下,情况可能不那么明显。如果你sort从班上的 20 个地方打来电话,你确定你每次都检查过吗?

这是品味和平衡的问题,没有“一刀切”的答案。平衡在于代码清晰度(两种方式!),性能(在极端情况下),当然还有安全性。这取决于确切的上下文,我个人甚至不想保证我完全一致。(换句话说,“编码时的咖啡因水平”也可能会产生影响。)

请注意,您assert只会在断言打开时执行 - 我个人更喜欢一致地验证参数,但是您正在运行代码。我通常使用GuavaPreconditions中的类来使前提条件不显眼。

于 2013-06-07T05:52:45.080 回答
0

断言将使辅助函数排序更健壮使用。在将参数传递给任何方法之前检查参数是一种很好的方法,可以更好地控制在运行时意外发生的异常。

我的建议是在您的代码中使用这两种方法,因为不能保证所有排序调用者都会进行此类检查。如果辅助方法中的断言在算法上是高阶的或者看起来是多余的,那么可以通过使用 -disableassertions 或 -da 从命令行禁用它(特别是用于生产用途)。

于 2013-06-07T05:52:36.250 回答
0

你可以这样做。我将引用Oracle文档。

断言是 JavaTM 编程语言中的一个语句,它使您能够测试您对程序的假设。例如,如果您编写一个计算粒子速度的方法,您可能会断言计算出的速度小于光速。

我个人不使用断言,但从我收集的关于它的 oracle 文档的读数中,它使您能够测试您对您期望做什么的假设。Try/catch 块更适合优雅地失败,因为不可避免地会发生故障(如网络、计算机问题)。基本上,在一个完美的世界中,您的代码将始终成功运行,因为它在代码方面没有任何问题。但这不是一个完美的世界。另请注意:

经验表明,在编程时编写断言是检测和纠正错误的最快和最有效的方法之一。作为一个额外的好处,断言用于记录程序的内部工作,增强可维护性。

我会说用作偏好。为了回答您的问题,我主要使用它来测试文档所说的代码,同时测试您对代码的假设。正如第二个引用所提到的,它还有一个额外的好处,那就是告诉其他开发人员(或未来的你)你假设得到什么作为参数。作为个人喜好,我将控制流留给 try/catch 块,因为这是它们的设计目的。

*但请记住,可以关闭断言。

于 2013-06-07T05:56:17.850 回答