一个好的Javadevise合同库?

几年前,我对Java的DbC软件包进行了一次调查,对其中的任何一个都不满意。 不幸的是,我没有对我的发现保持良好的logging,而且我认为事情已经改变了。 有人会仔细比较和对比Java的不同DbC软件包吗?

WikiPedia有一个很好的关于Design by Contract的概述,最后还有一个关于第三方支持库的语言部分,其中包括一系列Java库。 大多数这些Java库都基于Java断言。

在这种情况下,您只需要先决条件检查 ,在Java参数validation (普通Java实现)下的SourceForge中,也有一个轻量级的Validate Method Arguments解决scheme。

根据你的问题,也许OVal框架,对于字段/属性约束validation是一个不错的select。 这个框架可以让你以各种不同的forms(Annotations,POJO,XML)来放置约束。 通过POJO或脚本语言(JavaScript,Groovy,BeanShell,OGNL,MVEL)创build客户约束。 而且它还实现了按合同编程 。

Google有一个叫做java合约的开源库。

Java合同是我们新的开源工具。 先决条件,后置条件和不variables作为注释中的Java布尔expression式添加。 默认情况下,它们什么都不做,但是通过JVM参数来启用,它们在运行时被检查。

• @Requires, @Ensures, @ThrowEnsures and @Invariant specify contracts as Java boolean expressions • Contracts are inherited from both interfaces and classes and can be selectively enabled at runtime 

Java的合同 。

我testing了contract4J一次,发现它可用但不完美。 你正在为全class的方法调用和入侵创build合同。

合同被创build为该方法的一个断言。 问题在于合同本身是用string编写的,所以如果合同仍然有效的话,你不需要IDE支持合同或者编译时间。

链接到图书馆

我看了这些已经很长时间了,但发现了一些旧的联系。 一个是JASS 。

另一个我曾经使用过的(并且喜欢)是Reliable Systems的iContract。 它有一个ant的任务,你会作为一个预处理器运行。 但是,我似乎无法find一些谷歌search,它看起来已经消失。 原来的网站现在是一个链接农场。 看看这个链接的一些可能的方法来实现它。

有一个Groovy扩展,可以在Groovy / Java代码中使用合同devise(tm) – GContracts 。 它使用所谓的封闭注释来指定类不变式,前置条件和后置条件。 示例可以在项目的github wiki上find。

主要优点:它只有一个没有外部依赖的jar,并且可以通过Maven兼容的资源库解决,因为它被放置在Maven的中央仓库中。

我强烈build议您考虑Javabuild模语言( JML )。

我认为许多DbC库被内置断言关键字(自从Java 1.4引入)所笼罩:

  • 它是一个内置的,没有其他的图书馆是必需的
  • 它与inheritance一起工作
  • 您可以激活/取消激活包的基础上
  • 容易重构(例如,评论中没有断言)

我个人认为,目前可用的DbC库已经有很多不足之处了,我所看到的这些库中没有一个在Bean Validation API中发挥得很好。

我看过的图书馆已经logging在这里

Bean Validation API与DbC的概念有很多相同之处。 在某些情况下,BeanvalidationAPI不能像简单的POJO(非CDI托pipe代码)一样使用。 国际海事组织围绕豆authenticationAPI思考包装应该就足够了。

我发现现有的库是添加到现有的Web项目有点棘手,因为它们是通过AOP或Byte代码工具实现的。 可能随着BeanvalidationAPI的出现,这种实现DbC的复杂性是没有根据的。

我也在这篇文章中logging了我的咆哮,并希望构build一个利用Bean Validation API的小型库

如果你想要一个简单明了的基本支持来expression你的契约,看看valid4j(在Maven Central上可以findorg.valid4j:valid4j)。 它可以让你使用普通的代码(没有注释,也没有评论)使用普通的hamcrest-matchers来expression你的合同。

对于前置条件和后置条件(基本上是断言 – >抛出AssertionError):

 import static org.valid4j.Assertive.*; require(inputList, hasSize(greaterThan(0))); ... ensure(result, lessThan(4.0)); 

如果您对默认的全局策略(抛出AssertionError)不满意,valid4j提供了一个自定义机制,让您提供自己的org.valid4j.AssertiveProvider实现。

链接:

我会build议一些工具的组合:

  • Java的assert condition...或者它是更高级的Groovy表亲,番石榴的Preconditions.checkXXXX(condition...)Verify.verify(condition...) ,或者像AssertJ这样的库,如果你只需要做简单的检查在你的“主”或“testing”代码中

  • 你会得到更多的function,像OVal的工具; 它可以检查对象以及方法参数和结果,还可以手动触发检查(例如,在调用方法之前在UI上显示validation错误)。 它可以理解现有的注解,例如从JPA或javax.validation (如@Column @Pattern@Column @Pattern@Column @Pattern ),或者可以像@Pre(expr="x >= 0 && x <= y")那样编写内联约束。 如果注释是@Documented ,则这些检查也将在Javadoc中可见(您不必在那里描述它们)。

  • OVal使用reflection,这可能会在Android等一些环境中导致性能问题和其他问题; 那么你应该考虑像Google的Cofoja这样的工具 ,它具有较less的function,但依赖于编译时注释处理工具而不是reflection