1

我在看番石榴的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 库呢?

4

1 回答 1

1

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

更常见的是显式验证检查,例如 JavaObjects.requireNonNull和 Guava 的Preconditions. JSR-303 Bean Validation在数据模型中相当普遍,但很少用于接口。对于接口来说,更流行的是依靠单元测试和库的帮助,例如 Guava 的NullPointerTester,以确保合同得到履行。许多人更喜欢的一种风格选择是使用JSR-305来改进 Findbugs 和 ErrorProne 等静态分析器可以验证的文档。JSR-308与此类似,但尚未流行起来。

于 2015-05-26T01:19:11.500 回答