2012-10-11 90 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來幫你完成工作。