【问题标题】:Equals method in Joshua Bloch's Effective JavaJoshua Bloch 的 Effective Java 中的 Equals 方法
【发布时间】:2015-03-23 10:52:54
【问题描述】:

请查看 Joshua Bloch 的 Effective Java 的 link

在第二段中,作者说:

该类是私有的或包私有的,并且您确定它的 equals 方法永远不会被调用。 可以说,equals 方法应该被覆盖在这些情况下,万一它被意外调用:

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

请解释一下。我对作者使用术语私有类感到困惑,当我们确定不会调用 equals 方法时,为什么需要覆盖它。

【问题讨论】:

  • 无法访问该页面。报告重要部分。
  • 先生,这里是这篇文章的另一个链接jtechies.blogspot.in/2012/07/…\
  • 你:"当我们确定它不会被调用时"; Joshua Bloch:“以防它被意外调用”。您还有其他问题吗?
  • 先生,我不得不问,当这个类是包私有时,这意味着它只能在它的包中访问,而不能在外部访问。而且,由于我们自己编写了包,因此我们永远不会在代码中调用该方法。在包之外,它永远不会被调用。那么为什么我们需要重写方法来抛出断言错误
  • @user961690 你不应该那么相信自己。每个人都会犯错,即使你自己编写了那个类,你仍然可以调用equals,因为你只是忘记了,你不应该那样做。尤其是如果你在这门课上的最后一次作业是几个月前。

标签: java equals effective-java


【解决方案1】:

一个类只有当它是一个内部类时才可以是私有的。

至于“为什么”需要覆盖equals,原因是通过如您所展示的那样编写它,您将确保该方法永远不会被有意调用。六个月后的那一刻,当项目的新开发人员将调用该类的 equals 时,方法抛出并表示调用它是不正确的。这是好事;它可以防止“忘记”它。

【讨论】:

  • 您的第一个陈述不准确。类不仅不需要是内部的(嵌套类当然可以是私有的),它还可以是与另一个类在同一个编译单元中的顶级类。
  • 您对嵌套类是正确的;我写了“内在”,但我的意思是两者兼而有之。但是我似乎无法让您的第二个案例工作:this gist 当另存为 MainClass.java 时似乎无法编译。
  • 相关书中的引述是"private or package-private",因此同一编译单元中的包私有顶级类也适用于此。跨度>
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多