这会是个好主意吗?如果不是,现在如何解决?
我认为添加
会很有意思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
}
您怎么看?
答案 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
方法(尽管我甚至质疑),但你肯定不希望建议在顶级更改它并且它的所有默认行为对象。