2010-04-16 32 views
2

我有一個接口和兩個實現該接口的對象,大大簡化了;比較兩個實現相同/相等接口的對象 - 設計幫助

public interface MyInterface { 
    public int getId(); 
    public int getName(); 
    ... 
} 

public class A implements MyInterface { 
    ... 
} 

public class B implements MyInterface { 
    ... 
} 

我們使用一個實現到另一個遷移,但我需要檢查所生成的B型的對象是等價於A型具體來說,我的意思是,對於所有的接口方法的類型A和類型B的對象將返回相同的值(我只是檢查我的代碼生成此對象是正確的)。

你會怎麼做呢?

Map<String, MyInterface> oldGeneratedObjects = getOldGeneratedObjects(); 
Map<String, MyInterface> newGeneratedObjects = getNewGeneratedObjects(); 

// TODO: Establish that for each Key the Values in the two maps return equivalent values. 

我在這裏尋找良好的編碼實踐和風格。我明白,我可以迭代一個關鍵集合,拉出兩個對象應該是等價的,然後調用所有的方法,並比較,我只是想可能有一個更清潔,更可擴展的方式,我有興趣學習可能有什麼選擇。

將適當/可能/建議覆蓋等於或實現可比較?

由於提前,

加文

回答

2

我會在測試類實現的equals定製版本,而不是內部的任何的實現類的(因爲它與常規equals合同衝突)。喜歡的東西:

boolean equals(A a, B b) ... 

據我所知,這個檢查只能遷移期間是必需的,所以每個執行正常equals方法不應受此影響。也就是說,A.equals應該只返回true對於A的等值實例,並且應始終返回falseB的實例。反之亦然。

一旦遷移結束,您不再需要類A既不是測試者類,也可以繼續使用類B而無需觸及其實現。

注意,如果MyInterface(或AB)延伸Comparable,你也應該測試,在AB的實現是等價的。

(你當然知道,如果你實現equals還必須實現hashCode

+0

好極了,這對我來說很有意義,我會寫代碼的測試和不斷的實現的方程。 你說得對,這段代碼只會在遷移過程中使用。 – gav 2010-04-16 08:39:45