2012-05-09 81 views
1

我必須比較兩個不同類型的複雜對象(並且在類型層次結構中沒有公共超類),但邏輯上它們可能是等價的。 問題在於如何在對象不相等的情況下返回有關比較結果的信息;我想告訴調用者爲什麼這些對象不是等於的(哪些字段是不同的,它們有什麼不同)。如何在比較兩個複雜對象時返回比較差異?

選項迄今有:

  • 返回一個字符串
  • 拋出一個異常

,但我不覺得他們很優雅/不錯。

此外,有沒有辦法從委託的JUnit領域比較來的assertEquals並且因此圖基我JUnit的比較而不比較測試是一個實際的單元測試?

回答

4

如果比較複雜,比較的結果是(你提到)潛在的複雜。

因此,我建議你考慮第三種選擇:創建一個自定義類,ComparisonResult封裝結果的信息。

你甚至可以創建一個小的層次結構,並依靠多態性來簡化代碼。這裏有一個例子:

ComparisonResult 
| 
+--- Equals 
| 
+--- Not equals 
    | 
    +--- Compatible (with "isAbeforeB()") 
    | 
    +--- Incompatible (with "getReason()") 

Incompatible大概是最凌亂的類,我建議你爲什麼對象是不兼容的原因列表實現。一個原因或許本身就是一個抽象類,與子類,如MissingField

+0

這樣的類的示意結構是什麼? – m3th0dman

+0

我只是發佈相同:) +1 @ m3th0dman:它取決於你比較的兩個對象之間的差異 - 我可能會建議每個可能的差異的字段。 – javatutorial

0

小心!如果您的比較實現不匹配equals,那麼在不同容器實現中使用該對象時可能會遇到麻煩。

這就是說,比較接口只能返回int,所以你不得不拿出一個不同的方法來做不是的阻礙可比。

0

equals方法應只返回一個布爾值(等於或不等於)。

你不應該混的比較功能,並獲得差異。

你的目的是有意義的實現額外的方法(a.getDifferences(b)或靜態方法Comparision.getDifferences(A,B),如果你沒有一個共同的超類(除了對象))

對於實現等於它有意義的調用getDifferences方法並檢查返回的對象是否爲空。然後

結果可能是一個字符串或一個單獨的對象

0

你可以回差的對象列表或字符串列表,其中每個項目沃爾德表示一個區別。