所有 类 都应该有 .equals 和 .hashcode 方法吗?

Should all classes have a .equals and .hashcode method?

我正在做一个单元测试项目,其中断言调用 .equals 方法。但是之前项目的人并没有生成这些方法。

在编写代码时自动生成这些方法是否被认为是最佳实践?所有程序员都应该这样做吗?

我正在搜索有关 .equals 和 .hashcode 方法的更多信息,其中大部分似乎都是针对如何实现或覆盖它们的。

这主要是一个品味问题 - 如果您不希望使用 equals 方法(例如,不使用 assertEquals,永远不要打算使用 class作为 Map 中的键,等等),写它意味着你可能在写死代码,一些约定提倡避免它。

在这里,似乎没有问题 - 如果您打算使用 assertEquals,则需要实现 equals 方法。如果您要实施它,您可能还应该实施 hashCode 以便将来证明您的代码不会出现偷偷摸摸的、难以发现的错误。

这些方法的自动生成使我们能够实现一些标准的实现。一种标准实现编码为对象:比较链接和本机哈希码计算。 除非你能想象出适合你项目中所有实体的其他标准实现,否则你可能不应该自动生成等号和哈希码:手动实现它,当你知道未来比较的所有条件时。