【问题标题】:TDD rule and Java contract conflictTDD 规则和 Java 合约冲突
【发布时间】:2022-01-01 11:42:46
【问题描述】:

TDD 的规则之一是:

Write production code only to pass a failing unit test

Effective Java Item 11(第三版),即java Object.hashCode()的同一个契约:

Always override hashCode when you override equals

如果我们只需要重写 equals 以通过失败的测试并且我们不需要在当前失败的测试中使用集合中的对象并且将来可能会发生这种情况,那么现在该怎么做?

【问题讨论】:

  • 首先:这些是“唯一”指南。其次,如果我们编写一个测试来验证equals(...) 是否按预期工作,我们还应该编写一个测试来确保hashCode() 满足equals(...)hashCode() 之间的约定。所以这里没有矛盾。
  • 但我们根本不需要为当前测试覆盖hashCode()(现在)。
  • 再次:然后我们编写一个测试来验证equals(...)hashCode() 之间的合约是否成立。根据给出的论点,我们将能够编写一个失败的测试,可以通过覆盖被测单元中的hashCode() 来修复它。这使我们能够在给定的约束下覆盖hashCode()
  • 如果你不想覆盖哈希码,你认为你不需要它,那么你就不必。请注意您在代码中留下的陷阱。
  • 为什么不使用 Lombok 或类似的东西?节省大量样板代码和测试。

标签: java tdd equals hashcode


【解决方案1】:

当你覆盖equals时总是覆盖hashCode

试试这个拼写:如果你必须覆盖equals,那么你的工作没有完成,直到你也覆盖了hashCode

因此,在合同的所有必需元素都完成之前,不要合并/共享/发布作品。

但是你可以按照你喜欢的任何顺序来做这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2020-08-04
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多