2012-10-11 32 views
0

有什么设计模式(或习惯用法)有助于在Java中实现equals()方法吗?

这个任务很困难,但在大多数情况下它大致相同...这就是为什么我猜测有一个模式,但我没有找到它。执行equals()方法设计模式

UPDATE 

我选择的方法:generate equals() method in Eclipse但是...我发现了一个很好的方式(在AbstractList中),使生成的代码更好:

if (!(attributes ==null ? other.attributes==null : attributes.equals(other.attributes))) 
    return false; 

,而不是产生:

if (attributes == null) { 
     if (other.attributes != null) 
     return false; 
    } else if (!attributes.equals(other.attributes)) 
     return false; 
+3

看看这个:http://www.artima.com/lejava/articles/equality.html – flash

+0

我正要发布相同的链接。要特别注意#4,因为它在其他文章中经常被忽略。 – SJuan76

回答

3

通常为了实现equals()方法,我所做的是:我从Eclipse生成那些,因为Eclipse可以很好地生成hashCode,toString和equals()方法。

+0

http://www.artima.com/lejava/articles/equality.html;检查#4 – SJuan76

+1

我检查了。生成的代码遵循该规则。 –

+0

如果您更详细地解释如何在eclipse中自定义equals()和hashcode(),toString()方法生成,那对他来说会更有帮助。 –

1

在某种意义上说,当两个对象是“相同的”时,决定你自己是多么的重要......当它们包含相同的数据(完全有效的用例)时它们应该是相等的,或者当它们是山姆时内存中的物理对象(也是有效的),还是与集群环境中的数据库中的同一行相同?

只记得还覆盖.hashCode()或者你带来的伤害的世界:-)

(此外,从@Andreas和@flash好文章的建议。)

干杯,

1

也许这有助于:Implementing equals。尤其要注意hashcode()和equals()之间的密切关系。除此之外,我认为equals()的具体实现实际上取决于您的类设计,意味着您何时将两个对象视为相等。

0

不确定你的期望。 equals()是为了定义您的标准,比较两个不同的对象的平等的两个对象。

通常,您逐个比较每个属性,但它的可能性很大,并且支持使用较少的选定属性进行比较。

4

我总是用下面的代码:

if (null == obj) return false; 
if (this == obj) return true; 
if (!(object instanceof MyClass)) return false; 
MyClass that = (MyClass) obj; 
EqualsBuilder eb = new EqualsBuilder(); 
eb.append(this.businessKey, that.businessKey); 
return eb.isEquals(); 

...

我从来没有使用技术要点样序列或PK的,总是业务领域。 因此,我不认为这可以作为通用的,但必须针对任何给定的类。

+0

如果obj为null,那么测试的instanceof将失败 - 所以你可以修剪下来更多:) – AutomatedMike

1

看看Java Language Specification说了些什么。

equals方法只是从有参与设计此方法没有设计模式定义对象平等的观念

分开。事实是,equals方法已经由Java语言设计者设计,您只能使用该设计。如果你对如何编写自己的equals方法没有信心,可以考虑使用IDE的eclipse来帮你完成工作。