2012-08-01 46 views
-1

这是个好主意吗?现在如何解决,如果没有的话?实现对象的“绝对等于”方法(称为same()或same())。好主意?

我认为这将是有趣添加

final boolean identical(Obj obj){ 
    return (this==obj); 
} 

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

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

这个问题从需求arised在这个其他问题(A Mechanism for having different equals (physical equals and logical equals) on objects in Collection)有一种方法可以将相同指针的列表与同等对象列表进行比较。有了这个想法,我们可以添加到收集界面:

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

您怎么看?

+7

你的方法和'=='有什么区别? – 2012-08-01 11:50:51

+0

如果你想比较身份而不是“平等”,只是不要在你自己的对象中重写'equals()'... – 2012-08-01 11:52:03

+0

这是一个重新发明车轮的例子。主要的(在我看来)这发生在有人发现自己比他们面前的所有计算机科学家都更聪明。 – Woot4Moo 2012-08-01 12:25:03

回答

2

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

关于你提到的3种方法添加到集合接口:

coll.equals(coll2):这个人是已经在Collection接口。

coll.identical(coll2):等效于coll == coll2,但可读性较差。我没有看到这种方法的重点。

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

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

第三个是我提出这个问题的线索。我如何判断一个集合是一个浅拷贝还是一个包含所有对象的深拷贝obj1.equals(obj2)?我试试你的方法! – Whimusical 2012-08-01 12:34:45

2

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

0

对象上现有的“equals”方法已经做到了 - 对吧?

下面是代码:

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

所以,如果你为“等于”的实现它执行,如果没有(那么默认情况下),它使用“==”的

+0

是的,但它可以被覆盖,所以你永远不能确定两个对象是等于IF和只有他们是相同的(或==)。让他们之间比较两个列表。即使它们看起来不是同一个实例,它们也是如此。 – Whimusical 2012-08-01 12:31:43

0

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

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

此外,还有大量代码依赖于当前定义的equals方法(例如HashMaps使用它来解析不同对象的哈希码冲突)。没有特别的原因,事情会在各地爆炸。

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

在我看来,覆盖你的对象的方法equals它是有道理的(虽然我甚至质疑),但你绝对不会建议改变它的顶层和它的默认行为的所有对象。

+0

评论者是正确的,相同()将意味着==。我们可以讨论这种别名的用途,但问题是任何对象都会有一个相同的方法加上等于一个的默认相同的方法。这意味着新的Rectangle(1,2).equals(新的Rectangle(1,2))应该始终为真,但新的Rectangle(1,2).identical(新的Rectangle(1,2))始终为false。我的问题是,我认为平等现在是用于平等的两个意思,我总是有问题。 – Whimusical 2012-08-01 12:41:09

+0

将等价性的定义与平等或引用平等分开是有用的,这样两个事物是等价的*如果它们是相等的并且没有办法使它们发生突变而变得不平等*。如果Object支持对等式和等价的单独测试,那么集合也可以这样做(如果两个集合包含相同的项目,则它们是相等的;如果它们可以保证总是包含等效的项目,则它们是等价的)。 – supercat 2014-02-10 20:37:09

相关问题