使用Java`assert`专门用于非null方法前置条件

时间:2014-03-11 21:31:17

标签: java exception null assert preconditions

是的,处理Java assert语句以及应该使用异常时,有很多问题和完美的答案。这个问题是关于一个特定的用例,通常属于“绝不使用assert确保先决条件”的声音类别,或者说是这样的话。所以,请再忍受我一会儿......

所有Java对象引用都可以是null,默认情况下为null。除了仅引用enum实现中指定的值集之外,即使null引用也可以是enum。因此,在大多数Java程序中必须进行大量的null测试。其中一些测试包括检查null作为给定API返回的值,表示缺席,故障打算由调用者处理,或者其他一些状态信息。但是,null的大多数测试都意味着在遇到意外null时提前失败。为了尽可能经常地“尽早失败”,同时还使用可执行代码作为自我记录的前提条件,可以使用引发异常的条件测试来检查不需要的null值。

但是...

不受欢迎的null值通常会导致NullPointerException在某个时刻被抛出,但可能会在null的来源可能很容易确定的时间点之后很久测试或调试应用程序。因此,null值通常不会被检测到,只是不正确使用的自我报告可能不是很有帮助。但无论是否因检测到意外null或由于试图取消引用它而引起异常,该异常几乎肯定是致命的,或者必须在完全支持任何导致任何异常的情况下处理。致命的例外。

因此,一个不受欢迎的,无意的null最终会在某个时间点咬人。在最好的情况下,测试前提条件只会将这一点移动到一个时间点,这可能使开发人员更容易找到问题的根源。但是,如果使用显式测试或异常来检查所有可能的不需要的null值,无论多么不可能,这会导致编译代码中的大量条件分支,其中要采用的预期和公共分支是跳过该分支的分支。抛出异常的代码。

考虑到所有这些以及Java对象引用的性质,似乎assert语句应该特别适用于排除null值的前置条件。在开发和测试中,启用前提条件并帮助检测和修复缺陷。在生产中,意外null值的致命错误会在以后发生,但通常不会发生 - 在任何情况下都不能接受null值的关键代码总是可以使用显式测试和抛出异常即使在其他地方使用assert。因此,使用assert可以限制生产代码中不必要的开销,这是常见且几乎无处不在的前提条件。

考虑到所有这些,是否有一个合理的论据反对将assert语句用于前提条件,这些前提条件专门记录和拒绝作为无效参数,输入或状态的null值?

1 个答案:

答案 0 :(得分:1)

我认为默认情况下assert被禁用的事实足以阻止我将它们用于任何关键的事情。