我正在研究现有项目。我有以下用户类的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;
}
答案 0 :(得分:3)
if (getClass() != other.getClass()) {
return false;
}
此检查应放在演员之前:
User other = (User) obj;
instanceof
和getClass()
之间的区别在于后者确保该类型不是子类型。所以:
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。