繁体   English   中英

我应该总是覆盖 equals、hashcode 和 toString 方法吗?

[英]Should I always override equals, hashcode and toString methods?

我有一个相当简单的问题:根据最佳编程实践,当我创建一个新的模型类时,我应该总是覆盖 equals、hashcode 和 toString 方法吗? 即使我不打算比较特定类的对象?

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

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

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

如果您希望以有效的方式显示模型类数据,则需要覆盖toString 假设您有一个模型类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?

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

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

hashcode and equal?

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

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

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

该决定应基于

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

我自己比较松懈,感觉不是每个班级都需要那么多关注(为了将来可能使用)。

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

由于 IDE 甚至库提供了用于生成方法的轻松创建的锅炉代码,因此工作量很小,但代码样式可能会变得不必要地臃肿。 特别是对于内部类。

当然,“回调”事件处理类不需要它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM