比较两个实现相同/等价接口的对象 - 设计帮助

时间:2010-04-16 08:10:04

标签: java

我有一个接口和两个实现该接口的对象,大量简化;

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.

我正在寻找良好的编码实践和风格。我很欣赏我可以通过一个键集迭代出两个应该是等价的对象,然后只调用所有方法并进行比较,我只是觉得可能有更清晰,更可扩展的方式而且我有兴趣学习可能有什么选择。

是否适当/可能/建议覆盖equals或实现Comparable?

提前致谢,

加文

1 个答案:

答案 0 :(得分:2)

我会在测试类中实现equals的自定义版本,而不是在任何这些实现​​类中(因为它会与常规的equals契约冲突)。类似的东西:

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

我知道只有在迁移期间才需要进行此检查,因此每个实现的正常equals方法不应受此影响。也就是说,A.equals只应为true的相等实例返回A,并且应始终为false的实例返回B。反之亦然。

迁移结束后,您不再需要A类和测试者类,并且您可以继续使用B类而无需触及其实现。

请注意,如果MyInterface(或AB)扩展Comparable,您还应该测试A和{{1}中的实现是等价的。

(你肯定知道,如果你实施B,你还必须实施equals。)