gpt4 book ai didi

java - 比较扩展相同父类(super class)的类

转载 作者:行者123 更新时间:2023-11-30 08:03:47 25 4
gpt4 key购买 nike

假设我们有一个类 MyEntity,它有一些带有 getter 和 setter 的字段。此外,类 EntityAEntityB 扩展了 MyEntityMyEntityA 中有一些字段不在 MyEntityB 中,反之亦然。当我们谈论实体时,EntityAEntityB 确实有它们自己的equals-方法,看起来像

@Override
public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof EntityA))
return false;
EntityA castOther = (EntityA) other;

return ((this.getId() == castOther.getId()) || (this.getId() != null && castOther.getId() != null && this.getId().equals(castOther.getId())));
}

hibernate 需要这个equals 方法来识别唯一的实体。

现在我想将 EntityA 的实例与 EntityB 的实例进行比较。如果 MyEntity 中的所有字段都匹配,我将它们定义为相同。

为了检查这一点,我让 eclipse 为我生成 equals 方法并将其复制到类似 isEqualWithRegardsToContent(MyEntity other) 的方法。

我发现这种方法存在一个大问题:如果有人向任一实体添加新列并且不更新 isEqualWithRegardsToContent(MyEntity other) 方法,它就会出现问题:实体可能被认为在内容方面是平等的,尽管他们不是。

我认为单元测试在这里没有帮助。

您有什么最佳做法吗?

最佳答案

一般来说,在处理继承树时不可能有一个功能齐全的 equals。 superclass.equals(subclass) 将不会返回与 subclass.equals(superclass) 相同的结果,打破对称性(这是 equal 的基本契约 - 如果 a .eq(b) 然后 b.eq(a))。

您只能在顶层实现 equals(),从而从父类(super class)的角度比较整个层次结构。这会起作用,但不会按“所有字段”(仅父类(super class)中的字段)进行比较。通常实体可以只通过它们的主键进行比较

我个人通常不会混合使用 2 - equals()hashcode() 我保留用于简单的数据存储类(或用于在 map 中查找的键)不是多态的。

在此处查看详细报道 - http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals-2.html

关于java - 比较扩展相同父类(super class)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com