为控制流实现 equals() 好吗?
Is it good to implement equals() for control flow?
假设我有一个 class Item
,它有很多字段,其中之一是 color
.
我还有另一个 class Holder
存储 Item
.
的实例
每个 Holder
可以有任意数量的 Item
实例,只要每个 Color
实例不超过一个。
如果两个项目的颜色相同,以 return 为真的方式实施 equals()
以在 Holder 中使用 Set
项目是否有意义?或者我应该只在所有字段都相等时才使 equals
return 为真并使用另一个逻辑来实现 Holder
逻辑?
- 最好为 class 的 equals 和 hashCode 方法创建覆盖。
- 主要考虑因素应该是什么真正使 class 的实例独一无二,什么 定义了 和 指定了 它。
- 如果颜色 属性 很好且完全定义了它,那就这样吧(尽管这至少在第一眼看来不太可能)。
- 如果不是,那么最好不要使用颜色字段作为确定唯一性的唯一字段,因为您不知道如何使用class 将来。
不,equals()
应该比较整个对象,或者应该比较 natural 唯一值,例如一个 ID 或一些项目代码。
颜色不是项目的自然唯一标识符,所以不要实现 equals()
来比较它。
相反,使用 TreeSet
和比较 color
.
的自定义 Comparator
或者,使用由 color
键控的 Map
。
假设我有一个 class Item
,它有很多字段,其中之一是 color
.
我还有另一个 class Holder
存储 Item
.
的实例
每个 Holder
可以有任意数量的 Item
实例,只要每个 Color
实例不超过一个。
如果两个项目的颜色相同,以 return 为真的方式实施 equals()
以在 Holder 中使用 Set
项目是否有意义?或者我应该只在所有字段都相等时才使 equals
return 为真并使用另一个逻辑来实现 Holder
逻辑?
- 最好为 class 的 equals 和 hashCode 方法创建覆盖。
- 主要考虑因素应该是什么真正使 class 的实例独一无二,什么 定义了 和 指定了 它。
- 如果颜色 属性 很好且完全定义了它,那就这样吧(尽管这至少在第一眼看来不太可能)。
- 如果不是,那么最好不要使用颜色字段作为确定唯一性的唯一字段,因为您不知道如何使用class 将来。
不,equals()
应该比较整个对象,或者应该比较 natural 唯一值,例如一个 ID 或一些项目代码。
颜色不是项目的自然唯一标识符,所以不要实现 equals()
来比较它。
相反,使用 TreeSet
和比较 color
.
Comparator
或者,使用由 color
键控的 Map
。