这是我对Coor类的equals类的实现,它只包含2个整数x和y。这是实现这种方法的正确方法吗?
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Coor temp = (Coor) obj;
if (temp.x == this.x && temp.y == this.y) {
return true;
} else {
return false;
}
}
答案 0 :(得分:7)
你可以再添加一个检查反身相等(等于自我):
public boolean equals(Object obj) {
// Reflexive equality: did I get passed myself?
if(this == obj){
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Coor temp = (Coor) obj;
return temp.x == this.x && temp.y == this.y;
}
答案 1 :(得分:5)
是的,它会的。
还要确保覆盖你的hashCode()方法 - 永远不要覆盖一个而不做另一个,它会混淆你的集合中的地狱。
您的情况可以使用散列,它只是将其中一个整数移位32位并将其添加到另一个创建一个完全唯一的长整数(在这种情况下是一个完美的散列函数 - 没有碰撞)
答案 2 :(得分:3)
似乎没问题。 为简洁起见,您可以这样做:
return temp.x == this.x && temp.y == this.y
而不是
if (temp.x == this.x && temp.y == this.y) {
return true;
} else {
return false;
}
另外,请记住对象合同(严重!)。
请参阅此处接受的答案: What issues should be considered when overriding equals and hashCode in Java?
这可以为您节省大量未来的头痛。
答案 3 :(得分:1)
检查出来:
http://www.javapractices.com/topic/TopicAction.do?Id=17
如果那篇文章太详细,那么缺点是: 你的实现是正确的,但你应该记住一些其他的事情:
您还必须实现hashCode。
equals将不再使用该对象的身份。听起来不是那个问题。
您可以将@Override注释添加到您的equals方法中。
答案 4 :(得分:0)
这是一种更直接的方式:
public boolean equals(Object other) {
return other instanceof Coor
&& ((Coor) other).x == x
&& ((Coor) other).y == y
}
答案 5 :(得分:0)
我相信这会很快发挥作用。我这样说是因为:
这个问题之前肯定已被问过很多次了。见这里:Overriding equals and hashCode in Java。一本名为 Effective Java 的书也非常详细地讨论了这个主题,并且特定章节与之相关联。
答案 6 :(得分:0)
只有一个来源可以读取如何覆盖Joshua Bloch的“Effective Java”的equals和hashCode:chapter 3。
如果你有一个好的IDE,比如IntelliJ,它会以正确的方式为你生成equals和hashCode。