标准对象建模识别对象的属性,聚合和associations。在实现类的equals()
方法时,您必须符合几个要求。有很多关于如何编写此方法的建议,包括pitfalls to avoid。但在实施equals()
时,我找不到任何建议,说明您是否应该检查关联。我很清楚你应该检查属性和聚合。
您应该检查equals()
中的关联对象吗?也就是说,平等是否应取决于相关对象?
答案 0 :(得分:1)
虽然我认为避免以关联为基础通常是一个好主意,但我认为这并不适用于所有情况。虽然这是一个很好的经验法则,但很可能会出现这种规则完全破裂的情况。
它完全依赖于域以及两个对象相等的含义。例如:
如果你有一群学生,由老师教授,你可以通过要求另一个队列必须包含相同的学生(成对平等)并由同一个老师教授来确定平等。在这种情况下,群组的平等严格依赖于它们中的每一个是相等的。
答案 1 :(得分:0)
平等不应该以任何方式依赖于关联对象,因此equals()
不应该检查关联对象。它甚至不应该取决于同事的身份,甚至取决于对象是否具有关联。我很惊讶这个建议没有经常明确地说明我找到它。
从对象建模的角度来看,很自然地认为具有不同关联的两件事是等价的。如果一个疯狂的科学家要创造一个完全相同的我,我们会说doppelgänger和我是“相同的”(等价),即使我们有不同的父亲(不同的 fathered-by) 协会)。 doppelgänger甚至可能没有父亲(如果科学家比疯狂的生物学家更疯狂的物理学家)。
审查协会介绍了实际问题。存在bi-directional associations(例如 spouse-of )导致无限循环的危险。间接关联的性能受到影响,需要检查工作集中可能的所有对象:如果您的Person
对象具有 parent-of 和 child-of 关联,Person.equals()
实际上会告诉您家庭树是否相同。
答案 2 :(得分:0)
答案 3 :(得分:0)
简短回答:make equals()做你需要做的事。但要小心。
如果类可以用作HashMap
中的键(或存储在HashSet
中),则equals()必须在地图中保持不变。这表明,为了避免大量的分析和/或错误,用作HashMap键的类应该将equals()
限制为有效的不可变字段 - 包括关联。
您还必须确保任何包含equals的关联对象具有类似的immutable-for-scope-equals()实现,并且不会在原始对象上执行equals(),从而导致失控递归。