java - 覆盖等于方法

标签 java overriding equals

这里是新手问题:

所以在我的大学作业中,我必须为我创建的新类覆盖对象类 equals 方法。

新类是“Product”,每个产品都有一个唯一的“id”属性。所以这就是我重写它的方式:

@Override
public boolean equals(Object obj) {
       final Product other = (Product) obj;
       if (id != other.id)
           return false;
       return true;
   }

事情是,这样做是 1.5 分(满分 10 分),这让我怀疑是不是那么容易。所以我开始搜索,我发现了类似的东西:

@Override
public boolean equals(Object obj) {
       if (this == obj)
           return true;
       if (obj == null)
           return false;
       if (getClass() != obj.getClass())
           return false;
       final Product other = (Product) obj;
       if (id != other.id)
           return false;
       return true;
   }

这对我来说根本没有意义,因为我认为最后一个 if 检查所有其他 ifs 限制。你们怎么看?Override this method 的更好方法是什么?

谢谢!

最佳答案

第二段代码更好:

  • 它针对 x.equals(x) 进行了优化,这对于正确性来说不是必需的,但却是一种有用的优化
  • 它处理 x.equals(null) 而不是抛出 NullPointerException
  • 它处理完全不同类的对象而不会抛出您的类会抛出的 ClassCastException(例如 x.equals("foo"))
  • 它需要完全相同的类型来提供对称关系;否则 obj.equals(x) 可以调用不同的方法,给出不同的结果。

关于java - 覆盖等于方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364258/

相关文章:

java - 如何在 Java/Spring 中自动重新加载 messages.properties 文件?

java - 如何让 JAX-RS 返回 Java 8 LocalDateTime 属性作为 JavaScript 样式的日期字符串?

ruby-on-rails - Rails + Zurb - 如何确定 CSS 的优先级

Swift 覆盖默认初始化无子类

scala - 空列表平等如何工作?

prolog - “Not equal”登录Visual Prolog吗?

java - 如何通过java在android中制作动画

java - 使用 Boolean AND 时显式评估两个条件

php - 为什么在 Laravel AuthController 中重写 postRegister 不起作用?

java - 一个完全可重写的 compareTo() 方法?