我正在对一堆代码进行质量检查,发现了几个实例,其中开发人员有一个实现 Comparable 的 DTO。此 DTO 中有 7 或 8 个字段。 compareTo 方法仅在一个字段上实现:
private DateMidnight field1; //from Joda date/time library
public int compareTo(SomeObject o) {
if (o == null) {
return -1;
}
return field1.compareTo(o.getField1());
}
同样,equals 方法被覆盖,基本上可以归结为:
return field1.equals(o.getField1());
最后hashcode方法的实现是:
return field1.hashCode;
field1
永远不应为 null,并且在这些对象中是唯一的(即,我们不应获得具有相同 field1
的两个对象)。
所以,实现是一致的,这很好,但我应该担心只使用一个字段吗?这是不寻常的吗?它是否可能导致问题或混淆其他开发人员?我正在考虑传递这些对象的列表并且另一个开发人员使用某种 Map 或 Set 并从这些对象获得异常行为的场景。任何想法表示赞赏。谢谢!
最佳答案
我怀疑这是“首次使用获胜”的情况 - 有人需要对这些对象的集合进行排序或将它们放入 HashMap 中,而他们只关心日期。实现它的最简单方法是覆盖 equals
/hashCode
并实现 Comparable<T>
按照你所说的方式。
对于专家排序,更好的方法是实现 Comparator<T>
在不同的类中......但不幸的是,Java 没有任何用于相等性测试的等效类。老实说,我认为这是 Java 集合的一个主要弱点。
假设这真的不是“一个自然而明显的比较”,它在设计方面肯定有味道......并且应该非常仔细地记录。
关于java - 我应该关注这个 compareTo/equals/hashCode 实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343506/