问题描述
假设我有一个类 Item
,它有很多字段,其中之一是 color
。
我还有另一个类 Holder
存储 Item
的实例。
每个 Holder
可以有任意数量的 Item
实例,只要每个 Color
存在的实例不超过一个。
以在两个项目的颜色相等时返回 true 的方式实现 equals()
是否有意义,以在 Holder 内部使用 Set
项目?或者我应该让 equals
只有在所有字段都相等时才返回 true 并使用另一种逻辑来实现 Holder
逻辑?
解决方法
不,equals()
应该比较整个对象,或者应该比较自然唯一值,例如ID 或某些商品代码。
颜色不是项目的自然唯一标识符,因此不要实现 equals()
来进行比较。
相反,使用带有比较 TreeSet
的自定义 Comparator
的 color
。
或者,使用 Map
键控的 color
。
- 最好为您的类的 equals 和 hashCode 方法创建覆盖。
- 主要考虑应该是什么真正使类的实例独一无二,什么定义和指定它。
- 如果颜色属性很好且完全地定义了它,那么就这样吧(尽管这听起来至少在第一次看来不太可能)。
- 如果不是,那么最好不要使用颜色字段作为确定唯一性的唯一字段,因为您不知道将来如何使用该类的实例。