【问题标题】:overriding Object methods good programming practice?覆盖对象方法良好的编程习惯?
【发布时间】:2013-04-10 17:27:33
【问题描述】:

对于一个编程项目,我们制作了大约两打我们需要的类。即使我们没有使用它们,从 Object 覆盖 equals()hashcode() 函数是一种好的编程习惯吗?我们认为如果我们将来需要它们可能会很好,但我们不确定。

【问题讨论】:

    标签: java overriding


    【解决方案1】:

    除非您需要与Object 提供的实现不同的equalshashCode,否则不要覆盖它们。如JavaDoc 中所述,Object 版本...

    ...在对象上实现最有区别的可能等价关系;也就是说,对于任何非null 引用值xy,当且仅当xy 引用同一个对象(x == y 具有值@ 时,此方法才返回true 987654333@).

    只有在您需要 equals 的不同含义时才覆盖它们(例如,String 就是这样)。 (而且你说得很对,如果你覆盖一个,你几乎总是需要覆盖另一个。)

    【讨论】:

      【解决方案2】:

      不是真的。仅在需要时才这样做。

      【讨论】:

        【解决方案3】:

        编写一些你知道你不需要的东西是没有意义的。

        OTOH、equals 和 hashCode 对重写非常有用,您可能很容易在不知不觉中使用它们,例如

        • 将对象放入HashMap
        • 间接测试相等性,例如带有单元测试assertEquals
        • 测试对象是否存在于集合中

        基本上,如果您的对象具有值语义,以某种方式用作“数据”并且不是单例,那么您最终可能会因为上述一个或多个原因而不得不覆盖 equals。

        【讨论】:

          【解决方案4】:

          我会犹豫是否仅仅因为您“可能”需要它们而重写某些方法。让需求出现,然后解决问题。提供了这些方法的默认实现,并且可以使用集合开箱即用,添加您自己的实现可能会产生问题。

          【讨论】:

            【解决方案5】:

            有些方法使用equals,即使你不直接调用它。

            只有在真的需要时才应该这样做。 (如果 Object.equals()Object.hashcode() 没有为你的班级做它需要做的事情)

            【讨论】:

              【解决方案6】:

              您应该在需要时覆盖 equals()hashCode(),并且您应该始终覆盖 toString()

              【讨论】:

                【解决方案7】:

                除非你真的需要它,否则不要覆盖它。当您尝试将这些对象用作HashMap 的键时,您确实需要覆盖这些方法。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-09-11
                  • 1970-01-01
                  • 2013-11-29
                  • 2023-03-09
                  • 2012-02-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多