我在看番石榴的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与之相似,但尚未流行。