【问题标题】:Is it good to implement equals() for control flow?为控制流实现 equals() 好吗?
【发布时间】:2021-01-01 15:28:29
【问题描述】:
假设我有一个类Item,它有很多字段,其中一个是color。
我还有另一个类Holder 存储Item 的实例。
每个Holder 可以有任意数量的Item 实例,只要每个Color 不超过一个即可。
实现equals() 是否有意义,只要两个项目的颜色相等就返回true,在Holder 中使用Set 的项目吗?或者我应该让equals 只有在所有字段都相等时才返回true,并使用另一个逻辑来实现Holder 逻辑?
【问题讨论】:
标签:
java
set
equals
object-oriented-analysis
【解决方案1】:
不,equals() 应该比较整个对象,或者应该比较 natural 唯一值,例如一个 ID 或一些项目代码。
颜色不是一个项目的自然唯一标识符,所以不要实现equals() 来比较它。
改为使用 TreeSet 和自定义 Comparator 来比较 color。
或者,使用由color 键入的Map。
【解决方案2】:
- 最好为您的类的 equals 和 hashCode 方法创建一个覆盖。
- 主要考虑应该是什么真正使类的实例独一无二,定义和指定它。
- 如果它由颜色属性很好且完全定义,那么就这样吧(尽管这听起来至少在第一眼看来不太可能)。
- 如果不是,那么最好不将颜色字段用作确定唯一性的唯一字段,因为您不知道将来如何使用该类的实例。