我是否应该始终覆盖 equals、hashcode 和 toString 方法?

Should I always override equals, hashcode and toString methods?

我有一个相当简单的问题:根据最佳编程实践,当我创建一个新模型时 class 我是否应该始终重写 equals、hashcode 和 toString 方法?连我都不打算比较具体的对象class?

这些方法中的每一种都有其自身的意义。 equalshashCode 方法用于比较和散列,toString 主要用于日志目的。 如果您不需要这些功能中的任何一个,则无需实现它们。

另一个最佳做法是不要实现从未使用过的代码。因此,主要按需实施这些方法。实施这些方法而不立即使用它们的一个原因是确保其他开发人员在按需实施时可能无法意识到的特定实施或行为。所以对于你的问题:不,不总是。

决定应基于

  • 一致性(指南和代码检查器)
  • 质量
  • 代码风格
  • 努力(写作、阅读和理解含义)

我自己比较松散,感觉并不是每个class都需要那么多的关注(以备将来使用)。

虽然应该坚忍地遵循指导方针。代码检查器几乎从不被忽视。

由于 IDE 甚至库提供了易于创建的用于生成方法的锅炉代码,工作量很低,但代码风格可能变得不必要地臃肿。特别是对于内部 classes.

当然 "callback" 事件处理 class 不需要它们。

尽管以上答案是正确的,但我想补充说明为什么这些方法实际上被覆盖了。 如果您的模型 class 将用作 MapTreeSet 的键,最好的做法是覆盖 equalshashCode 方法(因为比较 2 个模型需要它 class对象)。

toString 如果您想以有效的方式显示模型 class 数据,则需要覆盖。 假设如果你有一个模型 class,Dummy,有 2 个字段,field1field2.

// Without overriding toString
System.out.println("field1: " + dummyObj.field1 + " field2"+dummyObj.field2);

// With overriding toString
System.out.println(dummyObj);

// Your overridden toString
public String toString(){
  return "field1: " + this.field1 + " field2"+this.field2;
}

根据my own perspective

你不应该总是覆盖 hashcodeequal 但你应该覆盖 toString

why toString?

假设您有一个 class 具有超过 10 个属性,并且您正在调试一个对象是否已填充,

我宁愿不检查 getter 而打印出一个对象会减少我的时间

hashcode and equal?

每当我们使用基于哈希的集合时,这两种方法都会出现,例如:

(1) hashSet, (2) hashTable, (3) hashMap and few more

如果您不打算使用对象的收集和比较! 那么你只有无用的代码会产生歧义