equals(object)方法的契约指定了要遵循的4个属性:自反,对称,传递和一致.虽然我理解不遵循Reflexive,Symmetric和Consistent的危险,并且肯定会同意其传递的好处,但我想知道如果违反Transitive属性会带来什么伤害?
具体来说,哪个Java库(或各种第三方库)需要依赖equals才能传递才能正常工作?根据我的理解,如果其他3个属性得到很好的实现,Collections框架将会起作用.
我有一个有float田地的课.例如:
public class MultipleFields {
final int count;
final float floatValue;
public MultipleFields(int count, float floatValue) {
this.count = count;
this.floatValue = floatValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要能够按值比较实例.现在我该如何正确实施 equals&hashCode?
通常的方式来实现equals,并hashCode是只考虑各个领域.例如,Eclipse将生成以下内容equals:
public boolean equals(Object obj) {
// irrelevant type checks removed
....
MultipleFields other = (MultipleFields) obj;
if (count != other.count)
return false;
if (Float.floatToIntBits(floatValue) != Float.floatToIntBits(other.floatValue))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
(和类似的hashCode,基本上计算count* 31 + Float.floatToIntBits(floatValue)).
这个问题是我的FP值受到舍入错误的影响(它们可能来自用户输入,来自数据库等).所以我需要一个"宽容"的比较.
常见的解决方案是使用epsilon值进行比较(参见 …