2010-04-16 34 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