java - Guava 是否支持合约类,或者是否允许接口(interface)文档?

标签 java guava contracts

我正在查看 Guava 的先决条件。如果您在实现方法中使用它们,那就太好了,但是是否可以使用它们来声明接口(interface)契约?

例如,在 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);
    }
}

Guava 中可能有这样的事情吗?如果没有,是否有另一个java库可以实现这一点?

最佳答案

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

更常见的是显式验证检查,例如Java的Objects.requireNonNull和Guava的PreconditionsJSR-303 Bean Validation对于数据模型来说相当常见,但很少在接口(interface)上使用。对于接口(interface),更流行的是依靠单元测试和库的帮助,例如 Guava 的 NullPointerTester,以确保契约(Contract)得到遵守。许多人喜欢的样式选择是使用 JSR-305改进文档,Findbugs 和 ErrorProne 等静态分析器可以验证。 JSR-308类似,但尚未流行。

关于java - Guava 是否支持合约类,或者是否允许接口(interface)文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30434816/

相关文章:

c# - 在发布版本中使用 System.Diagnostics.Contract

java - 使用 NumberPicker 作为输入法而不是标准键盘

guava - 无法解析导入 com.google.common.hash

java - 将 org.reSTLet.data.MediaType 转换为 com.google.common.net.MediaType

java - 找到匹配的谓词。谓词的谓词?

java - 将 Cofoja 与 Wicket 一起使用(甚至仅与 Maven 一起使用)

c# - WCF - 使用完全相同的数据契约(Contract)的多个服务契约(Contract)

Java 数据结构与 Redis

java - 向 apache Storm 添加一个新的主管节点给我带来麻烦

java - 无法读取从一个 BLE 设备发送到其他设备的特征值