4

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

4

4 回答 4

6

assert用来检查非公共方法的先决条件,仅此而已(我不主张按合同进行设计)。以防万一,让我提醒一下Programming With Assertions写的关于Preconditions、Postconditions 和 Class Invariants 的内容:

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

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

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

于 2010-04-26T00:19:41.200 回答
4

由于您的问题被标记为“java”和“design-by-contract”并且没有提到 JML,我想我会发布一个链接:

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

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

于 2010-04-25T23:50:42.147 回答
2

asserts 用于在您的代码中插入检查,这些检查将在开发过程中非常响亮地失败并在生产过程中被忽略(由标志确定)。

这是从 C 世界继承下来的,但由于 jUnit 提供了更系统的方法,因此没有流行起来,在这种方法中,您拥有独立的测试套件,而不是可以随意运行。

我建议您在调查 s 中的太多时间之前使用例如 junit 研究测试驱动开发assert。你很可能会发现,像我一样,断言不如单元测试有用。

于 2010-04-24T06:51:55.960 回答
1

我个人将断言用于所有不可恢复的病态场景——这就是它们的用途。这意味着我只断言应用程序逻辑中最关键的部分。当然,断言仅在开发和测试中启用。我们不想给生产代码带来负担,并且假设我们正确测试了所有内容,因此用户永远不会进入如此关键的场景。

于 2010-04-24T06:57:24.597 回答