实现“绝对等于”方法(称为same()或same())到Object。好主意?

时间:2012-08-01 11:49:29

标签: java object collections equals comparable

这会是个好主意吗?如果不是,现在如何解决?

我认为添加

会很有意思
final boolean identical(Obj obj){
   return (this==obj);
}

所以我们有一个改进的等于(逻辑等于)

boolean equals (Obj obj){
   return identical(obj); // by default, but its overrideable
}

这个问题源于另一个问题(A Mechanism for having different equals (physical equals and logical equals) on objects in Collection)需要一种方法来将相同指针列表与同等对象列表进行比较。有了这个想法,我们可以添加到Collection界面:

 coll.equals(coll2)
 coll.identical(coll2)
 coll.identicalElem(coll2){
      //current equals implementation of collections but calling identical to compare objects
 }

您怎么看?

4 个答案:

答案 0 :(得分:2)

我不知道您是否意识到这一点,但标准Java API中已经有IdentityHashMap。此外,您可以使用System.identityHashCode生成对象的哈希码。

答案 1 :(得分:2)

您发布的默认equals()实施已经是java.lang.Object中的实施。用相同的实现来覆盖它没有任何意义。

关于添加到集合界面的3种方法:

coll.equals(coll2):这个已经在Collection界面中。

coll.identical(coll2):相当于coll == coll2,但不太可读。我没有看到这种方法的重点。

coll.identicalElem(coll2):这个方法确实不存在,但我从来没有需要这样的方法,所以我认为它不应该混淆Collection的API。你可以使用Guava的Equivalence来做到这一点:

Equivalence.identity().pairWise().equivalent(coll1, coll2);

答案 2 :(得分:0)

对象上现有的“equals”方法已经这样做了 - 对吗?

以下是代码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

因此,如果您为'equals'提供实现,则执行该实现,如果不是(默认情况下),则使用“==”的

答案 3 :(得分:0)

这不是一个好主意,因为equals(Object)正在测试一个类的两个实例是否相等,而不是它们代表相同的实例(即它们的指针相等)。

如果你实现了“改进的”等于方法,你将会遇到以下问题: new Rectangle(1, 2).equals(new Rectangle(1, 2))返回false,这是荒谬的。

此外,还有大量的代码依赖于equals方法的当前定义(例如HashMaps使用它来解决不相同的对象的哈希码冲突)。不管怎样,事情都会在整个地方爆炸。

您建议的identical方法也不会在现有==运算符上添加任何值。

在我看来,覆盖有意义的对象的equals方法(尽管我甚至质疑),但你肯定不希望建议在顶级更改它并且它的所有默认行为对象。