写等于方法

时间:2019-04-26 19:21:38

标签: java equals

在所有情况下,第一个是否相等?或者最好使用第二个? 我都尝试了两次,但得到了相同的结果,但是也许有些情况下我没有尝试。


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;
}

2 个答案:

答案 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()。