我正在看番石榴的Preconditions
。如果你在实现方法中使用它们很好,但是可以使用它们来声明接口契约吗?
例如,在C#Contracts中你可以这样做 -
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库吗?
答案 0 :(得分:1)
按合同设计是一种非常优雅的方法,但从未在Java中流行。早期的实现使用XDoclet,然后使用AOP代理进行注释,然后使用字节代码预处理。一些实现的开销,它们的框架依赖性以及被定义为元数据使得大多数开发人员不能在实践中采用该方法。有像Contracts For Java这样的库,但很少有人积极维护。
更常见的是看到显式验证检查,例如Java的Objects.requireNonNull
和Guava的Preconditions
。 JSR-303 Bean Validation对于数据模型来说很常见,但很少在接口上使用。对于接口而言,它更受欢迎,依靠单元测试和库的帮助,例如Guava的NullPointerTester
,以确保合同得到尊重。许多人喜欢的样式选择是使用JSR-305来改进静态分析器(如Findbugs和ErrorProne)可以验证的文档。 JSR-308类似,但尚未流行起来。