2014-07-04 39 views
0

在我工作的其中一个应用程序中,我发现他们正在考虑使用null id的两个对象是不同的,这是java中equals()方法的正确行为吗?具有空ID的对象是相同的?

示例实现是如下::

public boolean equals(Object obj) { 
if (this == obj) { 
      return true; 
     } 
     if (obj != null && obj instanceof A) { 
      A a = (A) obj; 
      // If the id is null then its considered as different object. 
      if (a.getId() != null && a.getId().equals(this.getId())) { 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
} 
+2

这是一个应用程序级别的决定。这是一个可能的实现 - 它取决于你想要达到的目标。 (我将它写为'return a.getId()!= null && a.getId()。equals(this.getId())'' –

+0

另外,写'obj!= null && obj instanceof A'因为'instanceof'在第一个参数为空时返回'false' –

+0

thanx Jon Skeet你的答案似乎更容易理解 –

回答

0

这种事情最可能的应用是这些是插入数据库并从数据库中选择的对象。通常,在插入时,数据库会分配一个ID。

这意味着如果您拥有带ID的对象,它们就位于数据库中。如果两个对象具有相同的ID,则它们都代表数据库中的同一行。

但是,如果对象没有ID,那么您已经创建了它们,但是您尚未将它们插入到数据库中。如果您有两个这样的对象,都没有ID,那么这些对象最终会以数据库中的两个不同行结束。但现在,它们只存在于您的应用程序中。尽管如此,如果它们是两个不同的对象,那么它们确实代表两个不同的数据项 - 因此equals应该为这两个对象返回false。

0

阅读这个问题的方法:从传入对象空ID使得这两个对象不相等。这似乎是一个直截了当的理由;我不能说没有什么东西是平等的。

(哦,顺便说一句:在equals实现真正捣毁它需要在其他物体obj路过它会工作之前。)

+0

对不起,我的手动编辑..将更新我的问题 –

+0

仍然破碎 - 需要是一个'对象'类型的参数,最好命名为'obj'(因为这是你的代码中已有的约定)。 – Makoto

+0

@Makoto我认为'a'参数是一个错字,并编辑它... – ajb

0

这是完全正常的,但它可能是错误的。这将意味着,对于b = a.clone()a.equals(b) == true将取决于ID是否为空或不改变...的equals

规则是非常a.equals(b) == b.equals(a)

不过要小心,因为你的方法实际上并不是覆盖equals(Object),而是定义了一种不同的方法(我认为这只是一个问题,而错字虽然)。

+0

对不起,我的错误,更新了我的问题。 –

+0

@ user3679652仍不完全正确;现在它是一个过载,而不是一个覆盖。 – awksp

相关问题