在Java中使用assert是一种好习惯吗?

osh*_*hai 27 java assert

我知道关键字assert存在于java中.但是我不记得看到使用它的代码.可能我正在使用异常并登录我可以使用它的地方.assert在java中使用关键字是一个好习惯吗?

编辑:我知道断言一般是一个很好的做法.我的问题是,更准确一点,如果在java中,断言的BKM使用assert关键字而不是使用异常,日志记录和其他技术.

小智 24

断言未使用的主要原因是默认情况下未启用断言.因此,如果您的条件非常重要,需要断言,则不能依赖启用断言来完成工作.

正如其他答案已正确陈述的那样,它们是专为开发时测试和调试而设计的,因为如果在生产中禁用断言,它们就不会花费任何成本.我认为最好在测试框架中创建显式测试(例如边缘条件的单元测试),而不是依赖于在测试时启用断言的人.

但是,我看到使用断言的一个很好的例子是检查私有方法参数.由于您控制对这些方法的访问,因此您可以检查您自己的类是否正确使用该方法,而您的公共方法使用更可靠的参数检查技术(注释,if语句,第三方库等).这样,即使断言被禁用,您的方法也应该受到保护,但是查看源代码的开发人员可以查看您的方法的前提条件,并在处理该类时为其他安全网打开断言.


小智 13

当我用C++编写时,我使用的断言比使用Java时更多.我没有那么多使用它们,因为我不再需要它们了.我试图用断言捕获的许多C++错误在Java中不再是问题.

话虽如此,断言是非常有价值的,但许多人并没有使用它们,部分原因是因为他们不了解它们.我听说有人抱怨他们抛出错误而不是异常.我也听过这个问题:你为什么不使用异常处理案例而不是使用断言?

我对两者的回复是一样的.断言不应该捕获您希望在工作应用程序中看到的案例.断言的目的是捕获错误.你应该只使用它们来"处理"它们的唯一方法是返回并修复代码.这就是为什么他们不抛出异常 - 你不希望它们成为你的一般异常处理的一部分.

至于打开它们,我的IDE设置为默认打开它们.所以,对于我的内部测试,我总是知道他们正在进行.

这是一个断言是唯一使用的例子:我在一个大型Swing项目上工作,原始编码器不明白UI只能从事件线程更新,这导致了各种各样的错误.所以我在许多地方放置了这个断言,事情表现得很有趣:断言EventQueue.isDispatchThread(); 如果这个断言被触发,我们从错误的线程运行,开发人员需要得到通知,以便他们可以将代码移动到正确的线程.在工作应用程序中处理这个问题没办法.


irr*_*ble 8

是的,这很奇怪.该功能受到高度要求,但在引入该语言之后,几乎没有人使用它.

我有时使用assert作为评论工具.代替

// now it should be empty
Run Code Online (Sandbox Code Playgroud)

我可以写

assert size == 0;
Run Code Online (Sandbox Code Playgroud)

但我并没有真正开启assert,因此断言从未经过测试.

人们可能更喜欢从外部测试代码,并且他们不觉得需要在代码流中植入许多断言.


Ara*_*ram 5

是的,断言你的假设是一个非常好的做法。阅读合同设计。断言可用于在集成和测试阶段验证前置条件、不变量和后置条件。这有助于在开发和测试阶段捕获错误。您可以在生产中安全地关闭它以避免性能问题。

断言通常用于检查内部方法逻辑的正确性或在给定类中强制执行合同。但使用例外使合同变得明确。