正确覆盖等于方法

时间:2011-06-16 21:16:53

标签: java eclipse override equals

我的老师给了我一个等于最重要的例子的解决方案,它是这样的:

@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;
}

4 个答案:

答案 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 Productthis.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()...”(菜单源)