我的老师给了我一个等于最重要的例子的解决方案,它是这样的:
@Override
public boolean equals(Object o)
{
if (this == o) return true;
boolean result = false;
if (o instanceof Product)
{
Product other = (Product)o;
result = this.id == other.id;
}
return result;
}
该方法被覆盖了Product类,它具有每个产品唯一的属性id。但我不明白第一个的意思,我认为第二个如果已经检查了第一个的限制。任何人都可以给我一个这个代码工作的例子,下面这个没有?谢谢!
@Override
public boolean equals(Object o)
{
boolean result = false;
if (o instanceof Product)
{
Product other = (Product)o;
result = this.id == other.id;
}
return result;
}
答案 0 :(得分:4)
两个代码示例都有效。第一个示例中的if (this == o) return true;
是性能优化(最可能是过早优化 - 始终优先配置),它检查对象是否与自身进行比较。在Java中,==
运算符会比较两个对象是否是同一个实例,而不是它们是否是具有相同数据的不同实例。
有可能编写equals方法的样式。以下是我通常的做法:
public boolean equals(Object obj) {
if (obj instanceof Product) {
Product that = (Product) obj;
return this.id == that.id;
}
return false;
}
如果我知道我的代码永远不会将对象与其他类型的对象进行比较,或者反对null,那么我甚至可以编写如下所示的代码,这样如果反正发生它会引发异常 - 这意味着我的代码有一个bug,所以早期失败我会发现它并尽快修复它。
public boolean equals(Object obj) {
Product that = (Product) obj;
return this.id == that.id;
}
答案 1 :(得分:0)
你是对的。第一个if语句是多余的,因为this == o
暗示o instanceof Product
和this.id == other.id
。
如果论证是表现,我会说它过早地优化了。
答案 2 :(得分:0)
if (this == o) return true;
以上陈述是多余的。
更具体地说,它只是检查您是否正在将对象与自身进行比较 ...因此它可以跳过它下面的代码。例如:
Foo f = new Foo();
f.equals(f); //the if (this == o) would be true. References the same thing.
注意:顺便说一句,如果一个覆盖等于,则应覆盖hashcode()以维护hashcode()的一般契约 - 相等的对象必须具有相同的哈希码(反之则不然,因为两个对象可能具有相同的哈希但不相等。)
http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object)
答案 3 :(得分:0)
在eclipse中你可以选择“生成hashCode()和equals()...”(菜单源)