您是否有任何有效使用Java Assert的技巧?

时间:2010-04-24 06:35:06

标签: java assert design-by-contract fast-fail

我没有看到很多开发人员使用Java Assert,但我非常热衷于使用它们。您能否分享一些有效使用它们的技巧?

4 个答案:

答案 0 :(得分:6)

我使用assert来检查非公开方法的preconditions,这就是全部(我没有声称按合同设计)。为了以防万一,让我提醒使用断言编程写有关Preconditions, Postconditions, and Class Invariants的内容:

  

虽然断言构造不是一个完整的按合同设计工具,但它可以帮助支持非正式的逐个合同编程风格。

要获得Java的全面支持,可以考虑使用第三方库(来自Wikipedia):

  

iContract2,Contract4J,jContractor,Jcontract,C4J,CodePro Analytix,STclass,Jass预处理器,带AspectJ的OVal,Java建模语言(JML),Spring框架的SpringContracts,或现代Jass,使用AspectJ的Custos,使用AspectJ的JavaDbC, JavaTESK使用Java扩展。

答案 1 :(得分:4)

由于您的问题被标记为“java”和“按合同设计”并且未提及JML,我想我会发布一个链接:

http://www.eecs.ucf.edu/~leavens/JML/

JML是一种用Java编写契约的注释语言。合同可以通过运行时断言检查或静态验证。通过挖掘JML社区中已经完成的工作,您可以在Java和其他语言中找到合同设计的大量优秀原则和想法。 JML为其他语言启发了类似的注释语言,例如Spec#(用于.NET)和ACSL(用于C)。

答案 2 :(得分:2)

assert用于在代码中插入检查,这些检查在开发过程中会非常大声地失败并在生产期间被忽略(由标志确定)。

这是从C世界继承而来的,但由于采用了更为系统化的方法,因此没有流行起来。 jUnit你有独立的测试套件,可以随意运行。

我建议您使用以下方法查看测试驱动开发在assert s调查太多时间之前的junit。你很可能会像我一样发现断言没有单元测试那么有用。

答案 3 :(得分:1)

我个人对所有不可恢复的病态场景使用断言 - 这是他们的目的。这意味着我只断言应用程序逻辑中最关键的部分。当然,断言仅在开发和测试中启用。我们不希望用它们加载生产代码,并且假设我们正确地测试了所有内容,因此用户永远不会陷入如此危急的情况。