在User类中重写equals方法

时间:2013-10-30 08:59:29

标签: java equals

我正在研究现有项目。我有以下用户类的equals方法。当我将等式与equals进行比较时,我在

上得到假
if (getClass() != other.getClass()) {
  return false;
}

完整的equals代码:

@Override
public boolean equals(Object obj) {
  if (this == obj) {
    return true;
  }

  if (obj == null) {
    return false;
  }

  User other = (User) obj;
  if (getClass() != other.getClass()) {
    return false;
  }

  if (this.getUserId() == null) {
    if (other.getUserId() != null) {
      return false;
    }
  } else if (!this.getUserId().equals(other.getUserId())) {
    return false;
  }

  return true;
}

我需要在这里检查班级类型吗?如果是,为什么我的用户类不同?为什么我不能像下面那样检查班级类型?

if (!(obj instanceof User)){
  return false;
}

7 个答案:

答案 0 :(得分:3)

if (getClass() != other.getClass()) {
        return false;
    }

此检查应放在演员之前:

User other = (User) obj;

instanceofgetClass()之间的区别在于后者确保该类型不是子类型。所以:

User user = new SubUser();
boolean a = user instanceof User;
boolean b = user.getClass() == User.class;
System.out.println(a);
System.out.println(b);

会打印:

true
false

答案 1 :(得分:0)

您应该使用instanceOf方法以避免以后ClassCastException。如果将equals方法与错误的对象类型一起使用,则抛出此异常。

答案 2 :(得分:0)

约书亚布洛赫的Effective Java书提供了非常好的建议来实施许多,人们可能会考虑的标准情况。它包括实现equals方法的方法。

以下是修改后的实现:

@Override
public boolean equals(Object obj) {
  if (this == obj) {
    return true;
  }

  if (!(obj instanceof User)) { // this covers the null check
    return false;
  }

  User other = (User) obj; // this is now safe

  if ((this.getUserId() == null) && other.getUserId() != null) {
      return false
  } else if ((this.getUserId() != null) && !this.getUserId().equals(other.getUserId())) {
    return false;
  }

  return true;
}

这不是那么明显,但instanceof检查只返回false null值,因为没有办法识别它们的类型(即空值是无类型的)。​​

答案 3 :(得分:0)

首先,我认为你应该反过来行

        User other = (User) obj;
        if (getClass() != other.getClass()) {
            return false;
        }

成为

    if (getClass() != other.getClass()) {
        return false;
    }
    User other = (User) obj;

其次,equals方法在java集合库和其他许多库中都很重要,所以你应该考虑任何实现细节。

假设你有一个Employee类(带有id)被子类化到Manager中,所以你可以考虑在Employee上编写一个equals方法,只需检查id就可以了。但是,你呢?这取决于。

因此,如果您签入员工equals方法,如果您通过经理,它将返回true。但是,如果使用getClass检查类的相等性,则在传递管理器时它将返回false。

假设这两个类分别存储在一个employee表和一个manager表中的数据库中,数据库的id为一列,定义为一个autoincrement列。这意味着你可以让一个身份100的员工与身份100的经理完全不同。

另一方面,您可以拥有一个存储所有员工和经理的员工表。因此,如果你有一个id为100的员工对象和一个id为100的经理,那么他们必须是同一个人。

答案 4 :(得分:0)

对于你的问题,你应该把

 getClass() != other.getClass()

 User other = (User) obj;

Equqality是一个有趣的问题。许多人讨论过它。关于平等的一个细节可以在 Scala编程第二章第30章中看到。

答案 5 :(得分:0)

我发现,来自hibernate layer / DAO的User类不是直接的User类。它是用户或代理的子类。所以,当我用obj.getClass()检查时,它给出了false。

在这种情况下,最好不要与getClass()进行比较。

我查看了instanceof。

答案 6 :(得分:-1)

这里你声明你没有User的任何子类,所以你可以使用instanceof check。