想象一下,我们有以下简单的 mutable 类:
public class Point {
private int x;
private int y;
...
public void addToX(int delta) {
x += delta;
}
public void addToY(int delta) {
y += delta;
}
}
使用唯一的类字段hashCode
和x
覆盖y
方法将不起作用,因为在addToX
/ {{1}时,值可能会在运行时更改}方法被调用。
所以我想知道可变类的addToY
的适当实现是什么?
答案 0 :(得分:3)
假设您在Point#equals(Point p)的实现中使用x和y字段,则无需在Point类型的对象的生命周期内保持Point#hashCode()的一致性。
实际上,java.lang.Object类的javadoc声明了hashCode()
每当在同一个对象上多次调用它时 执行Java应用程序时,hashCode方法必须始终如一 返回相同的整数
但在那之后就有了一个限制:
,前提是没有在对象的等比较中使用的信息 改性
另见http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
答案 1 :(得分:2)
您在问题中暗示该类并不真正代表静态点,因为您可以更改x和y值。这就是为什么基于x和y值的哈希码对你来说是错误的。我认为这个类真正代表的是一个x和y值可以改变的位置。在这种情况下,你暗示的一个属性是该位置的识别(例如汽车37的位置),即使x / y值确实改变,该识别也不会改变。您希望定义这个具有唯一值的属性,将其添加到您的类中,并将该哈希代码(和等于)实现基于该属性