乔书记的《Effective Java》中的Equals方法

7
请查看 Joshua Bloch 的《Effective Java》的链接。在第二段中,作者说:

The class is private or package-private, and you are certain that its equals method will never be invoked. Arguably, the equals method should be overridden under these circumstances, in case it is accidentally invoked:

@Override public boolean equals(Object o) {
     throw new AssertionError(); // Method is never called
}

请解释一下这个问题。我对作者使用“private class”的术语感到困惑,为什么需要覆盖equals方法,当我们可以确定它不会被调用时。

请解释一下这个问题。我对作者使用“private class”的术语感到困惑,为什么需要覆盖equals方法,当我们可以确定它不会被调用时。

1
无法访问该页面。报告重要部分。 - V G
1
先生,这是另一篇文章的链接 http://jtechies.blogspot.in/2012/07/item-8-obey-general-contract-when.html - user961690
2
你:「当我们确定它不会被调用时」;Joshua Bloch:「以防它被意外调用」。你还有其他问题吗? - Tom
先生,我不得不问一下,当类是包私有时,这意味着它只能在其包内访问而不能在外部访问。既然我们自己编写了包,就永远不会在我们的代码中调用该方法。在包外,它将永远不会被调用。那么,为什么我们需要重写该方法以抛出断言错误? - user961690
3
你不应该这么自信。每个人都会犯错,即使你亲自编写了那个类,仍然有可能调用equals方法,因为你可能忘记了不应该这样做。特别是如果你最后一次编辑该类是几个月前的事情。 - Tom
1个回答

8

只有内部类才能被声明为私有。

至于“为什么”需要重写equals方法,原因在于按照您展示的方式编写它将确保该方法不会被故意调用。当项目中的新开发人员在六个月后调用该类上的equals方法时,该方法将会抛出异常并表明不正确地调用了它。这是一件好事;它可以防止对其遗忘不记。


1
你的第一个语句是不准确的。这个类不仅不需要是内部类(嵌套类也可以是私有的),而且它还可以是同一编译单元中另一个类的顶级类。 - chrylis -cautiouslyoptimistic-
关于嵌套类,你是正确的;我写了“内部”但我指的是两者。不过,我似乎无法让你的第二种情况工作:这个代码片段保存为MainClass.java后似乎无法编译。 - Andrea Bergia
1
问题书中的引用是“private或package-private”,因此在同一编译单元中,包私有的顶级类也适用于此。 - Radiodef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接