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

gav*_*gav 5 java

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

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

public class A implements MyInterface {
    ...
}

public class B implements MyInterface {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我们正在从使用一种实现迁移到另一种实现,但我需要检查生成的类型 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.
Run Code Online (Sandbox Code Playgroud)

我在这里寻找良好的编码实践和风格。我很感激我可以迭代一个键集,取出两个应该等效的对象,然后调用所有方法并进行比较,我只是想可能有一种更干净、更可扩展的方法,我有兴趣学习可能有什么选择。

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

提前致谢,

加文

Pét*_*rök 3

我将在测试类中实现自定义版本equals,而不是在任何这些实现​​类中(因为它会与常规equals合同发生冲突)。就像是:

boolean equals(A a, B b) ...
Run Code Online (Sandbox Code Playgroud)

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

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

请注意, if MyInterface(or Aand B) extends ,您还应该测试和Comparable中的实现是否等效。AB

(你肯定知道,如果你实现了,equals你也必须实现hashCode。)