java - 我应该关注这个 compareTo/equals/hashCode 实现吗?

标签 java implementation equals hashcode compareto

我正在对一堆代码进行质量检查,发现了几个实例,其中开发人员有一个实现 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/

相关文章:

c# - 在.NET 中,委托(delegate)的内部实现是什么?

java - 在 Java 接口(interface)中处理 equals 和 hashCode 的微妙之处

java - 序列化后使用 equals()

c# - 我应该如何实现 Object.GetHashCode() 以实现复杂的相等性?

java - 除 BigDecimal 值 : java. lang.ArithmeticException 时出错:非终止十进制扩展;没有精确可表示的十进制结果

Java:突出显示所有派生数据成员

java - 文件操作有时不起作用

java - 如何在 Java 中将大文本(字符串)作为 REST 服务的响应发送到 REST 客户端?

c++ - 周期性时间间隔调用函数的API

delphi - 实现多个接口(interface)的类的清晰度(委托(delegate)的替代方案):