有一个 Java bean 对象已经实现了equals
基于特定标准(Criteria A)的功能。我需要根据另一个标准(标准 B)识别唯一对象。由于该equals
函数使用标准 A,我不能使用HashSet
. 所以我想使用基于标准 B 的TreeSet
自定义。我的问题是,是否允许这样做?Comparator
这种方法有什么问题吗?
谢谢你。
有一个 Java bean 对象已经实现了equals
基于特定标准(Criteria A)的功能。我需要根据另一个标准(标准 B)识别唯一对象。由于该equals
函数使用标准 A,我不能使用HashSet
. 所以我想使用基于标准 B 的TreeSet
自定义。我的问题是,是否允许这样做?Comparator
这种方法有什么问题吗?
谢谢你。
以下是 Oracle Java 的一些指南:
请注意,如果要正确实现 Set 接口,集合维护的顺序(无论是否提供显式比较器)必须与 equals 一致。(参见 Comparable 或 Comparator 以获得与 equals 一致的精确定义。)这是因为 Set 接口是根据 equals 操作定义的,但是 TreeSet 实例使用其 compareTo(或 compare)方法执行所有键比较,所以两个从集合的角度来看,此方法认为相等的键是相等的。一个集合的行为是明确定义的,即使它的顺序与equals不一致;它只是不遵守 Set 接口的一般约定。
我认为在技术方面,不,你没有任何问题。但是,在编码、可读性和可维护性方面,你必须小心,因为其他人可能会误用或误解你在做什么
如果您经常执行搜索并且很少添加元素,请考虑将它们保存在List
按标准 B 排序的 a 中并使用Collections.binarySearch
.
您可以包装它们:
class BeanWrapper {
...
public boolean equals(Object other) {
return myBean.critB.equals(((Bean)other).critB);
}
}
并把它们像那样放在集合中。