签入合同 Java - 内置?例如。 Hashcode/Equals
Contract Checking in Java - In Built? E.g. Hashcode/Equals
Java 中是否有任何内置合同检查,例如哈希码和 equals 函数之间的契约?
对于这个问题,我们还是以 hashcode/equals 合同为例,但我对一般的合同检查很感兴趣。我在多个地方读到 equals 和 hashcode must satisfy a "contract" in Java:
- equals 必须遵循 equivalence relation 的三个规则,并且在重复调用时也必须保持一致
- 相等的对象意味着相等的哈希码
我了解这些条件,它们对我来说很有意义。然而,我想知道,这只是一个写在纸上的合同——本质上是开发人员不要编写错误代码的强有力的指导方针——还是它会被 Java 作为编译时间或运行时间异常?
编译时不会强制执行。
有些 类 可能会在运行时强制执行该行为 - 例如,您可以编写一个方法来检查两个相等的对象是否具有相同的哈希码或发送异常。
另请注意,在某些情况下,您可能希望故意偏离推荐的合同。
它不会(也不能)在编译或运行时自动捕获(除非您明确检查它。
简单的反例:
public boolean equals(Object other){
return new Random().nextInt(3) == new Random().nextInt(3);
}
public int hashCode() {
return new Random().nextInt(3);
}
然而,创建检查这些合同的单元测试是个好主意。我遇到过由于使用实施不当 equals/hashcode 而难以发现的错误。
Java 中是否有任何内置合同检查,例如哈希码和 equals 函数之间的契约?
对于这个问题,我们还是以 hashcode/equals 合同为例,但我对一般的合同检查很感兴趣。我在多个地方读到 equals 和 hashcode must satisfy a "contract" in Java:
- equals 必须遵循 equivalence relation 的三个规则,并且在重复调用时也必须保持一致
- 相等的对象意味着相等的哈希码
我了解这些条件,它们对我来说很有意义。然而,我想知道,这只是一个写在纸上的合同——本质上是开发人员不要编写错误代码的强有力的指导方针——还是它会被 Java 作为编译时间或运行时间异常?
编译时不会强制执行。
有些 类 可能会在运行时强制执行该行为 - 例如,您可以编写一个方法来检查两个相等的对象是否具有相同的哈希码或发送异常。
另请注意,在某些情况下,您可能希望故意偏离推荐的合同。
它不会(也不能)在编译或运行时自动捕获(除非您明确检查它。
简单的反例:
public boolean equals(Object other){
return new Random().nextInt(3) == new Random().nextInt(3);
}
public int hashCode() {
return new Random().nextInt(3);
}
然而,创建检查这些合同的单元测试是个好主意。我遇到过由于使用实施不当 equals/hashcode 而难以发现的错误。