Java中的合同检查 - 内置?例如。哈希码/的Equals

时间:2017-10-13 09:14:04

标签: java equals hashcode contract

是否有任何使用Java进行的内置合同检查,例如对于hashcode和equals函数之间的契约?

对于这个问题,让我们坚持使用hashcode / equals合约作为例子,但我一般对合同检查感兴趣。我已在多个地方读过等于和hashcode必须满足"合同"在Java中:

  • 等于必须遵循equivalence relation的三个规则,并且必须在重复调用时保持一致
  • Equal对象意味着相等的哈希码

我理解条件,他们对我有意义。但是,我想知道,这只是一份写在纸上的合同 - 本质上是开发人员不编写错误代码的强大指导 - 或者它是否会被Java捕获为编译时间或运行时间异常?

2 个答案:

答案 0 :(得分:1)

在编译时不会强制执行。

某些类可能会在运行时强制执行该行为 - 例如,您可以编写一个方法来检查两个相同的对象是否具有相同的哈希码或发送异常。

另请注意,在某些情况下,您可能会故意偏离建议的合同。

答案 1 :(得分:1)

它不是(也不可能)在编译或运行时自动捕获(除非您明确检查它。

简单的反例:

public boolean equals(Object other){
    return new Random().nextInt(3) == new Random().nextInt(3);
}

public int hashCode() {
    return new Random().nextInt(3);
}

但是,创建检查这些合同的单元测试是个好主意。我遇到了由于利用严重实现的equals / hashcode而难以发现的错误。