在所有情况下,第一个是否相等?或者最好使用第二个? 我都尝试了两次,但得到了相同的结果,但是也许有些情况下我没有尝试。
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Test)) {
return false;
}
Test test = (Test) o;
return name.equals(test.name);
}
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (this.getClass() != obj.getClass()) return false;
Test other = (Test) obj;
if (name == null && other.name != null) {
return false;
} else if (!name.equals(other.name)) {
return false;
}
return true;
}
答案 0 :(得分:2)
如果name
不能为null,则第一种方法很好;如果可以为null,请对最终的return语句进行一些修改:
return Objects.equals(name, test.name);
如果name
为空,这只会避免NPE。
不要在getClass()
检查中使用equals
:它违反了Liskov子类的可替换性。
在getClass()
方法中对equals
调用的Error Prone's check文档中可以找到更详细的描述和示例。
答案 1 :(得分:0)
如果name不能为null,则第一个equals()应该足够。如果name可以为null,则两个变体都不够(第二个equals不会同时检查两个名称== null)。
如果名称(以及所有对equals()起作用的字段)是不可变的,则应该看看Google’s Auto value annotation processor,它可以自动生成equals(),hashCode()和toString()。