有一个Java bean对象,它根据某些标准实现了equals
函数(标准A)。我需要根据其他标准识别唯一对象(标准B)。由于equals
函数使用条件A,因此我无法使用HashSet
。所以我想到TreeSet
使用基于标准B的自定义Comparator
。我的问题是,是否可以这样做?这种方法有什么问题吗?
谢谢。
答案 0 :(得分:15)
以下是Oracle Java的一些指南:
注意由a维护的排序 设置(无论是否明确 提供比较器)必须 如果是,则与等于一致 正确实现Set接口。 (参见Comparable或Comparator for a 精确定义符合 等于。)这是因为Set 接口是根据的定义的 等于操作,但是一个TreeSet instance执行所有关键比较 使用compareTo(或比较) 方法,所以两个键被认为 等于这个方法是,从 集合的立场,平等。该 集合的行为甚至是明确定义的 如果它的排序不一致 等于;它只是没有服从 Set接口的一般合约。
我认为在技术方面,不,你没有任何问题。但是,在编码,可读性和可维护性方面,你必须要小心,因为其他人可能会滥用或误解你在做什么
答案 1 :(得分:1)
如果经常执行搜索并很少添加元素,请考虑将它们保存在按条件B排序的List
中并使用Collections.binarySearch
。
答案 2 :(得分:1)
你可以包装它们:
class BeanWrapper {
...
public boolean equals(Object other) {
return myBean.critB.equals(((Bean)other).critB);
}
}
然后将它们放在那里。