我在看番石榴的Preconditions。如果在实现方法中使用它们,那很好,但是可以使用它们声明接口协定吗?

例如,在C#合同中,您可以执行以下操作-

using System.Diagnostics.Contracts;

[ContractClass(typeof(FooContract))]
interface IFoo
{
    void Bar(int i);
}

[ContractClassFor(typeof(IFoo))]
abstract class FooContract : IFoo
{
    public void Bar(int i)
    {
        Contract.Requires(i >= 0);
    }
}


番石榴有这种可能吗?如果没有,是否还有另一个Java库?

最佳答案

合约式设计是一种非常优雅的方法,但从未在Java上流行。早期的实现使用XDoclet,然后使用AOP代理进行批注,然后使用字节代码进行预处理。一些实现的开销,它们的框架依赖性以及被定义为元数据,使大多数开发人员无法在实践中采用该方法。有一些库,例如Contracts For Java,但很少有人积极维护。

查看显式验证检查(例如Java的Objects.requireNonNull和Guava的Preconditions)更为常见。 JSR-303 Bean Validation在数据模型中相当普遍,但很少在接口上使用。对于接口,它更受欢迎地依赖于单元测试和诸如Guava的NullPointerTester之类的库的协助,以确保遵守合同。许多人喜欢的样式选择是使用JSR-305以获得改进的文档,Findbugs和ErrorProne等静态分析器可以对其进行验证。 JSR-308与之相似,但尚未流行。

10-08 08:19