断言可以用于生产还是仅用于开发?

时间:2013-02-20 16:47:51

标签: java assertions

关注此问题: Avoiding != null statements 我问我们的一位高级开发人员为什么不使用断言。虽然他的答案证明是合理的(我们使用自定义例外),但他也声称断言是在开发和测试时使用,但不是在生产中。

但在Oracle的文档中 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 看起来断言意味着在测试之外使用,更多的是考虑到禁用它们的可能性。

那么,有没有更好的理由或良好做法不使用断言?

1 个答案:

答案 0 :(得分:0)

根据语言的不同,断言的行为会有所不同。在C中,它们经常被错误地使用,并且不正确的使用是如此常见以至于很多人建议它们根本不被使用。它们不应该用于生产(即C的生产编译应该为预处理器定义NDEBUG),因为它们只会减慢执行速度。

断言的目的是陈述逻辑上的必要性,而不是检查结果。例如,写正确(在C中):

f = malloc( s );
if( f == NULL ) {
   ...; exit( 1 );
}
assert( f != NULL );   # This is logically necessary.

但永远写错了:

f = malloc( x );        # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert( f != NULL );    # DO NOT DO THIS

这实际上很有用,因为写它是完全有效的:

f = xmalloc( x );
assert( f != NULL ); 

作为读者的文档,xmalloc的定义方式是永远不会返回空值。

它们通常在功能开始时使用:

void f( void *p ) { assert( p != NULL ); ... }

此类用法是错误检查。相反,它用于指示函数f期望永远不会传递空指针。对于开发人员来说,将空指针传递给f是一个编程错误。使其成为断言可以在启用断言时在运行时检测错误。