写等于方法

Write equals method

第一个是否对所有情况都足够,还是我应该使用第二个更好? 我都试过了,得到了相同的结果,但也许有我没有尝试的情况。


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

如果name不能为空,第一种方法可以;如果可以为null,对最后的return语句稍作修改:

return Objects.equals(name, test.name);

这只是在 name 为 null 时避免了 NPE。


不要在 equals 检查中使用 getClass():它违反了子类的里氏可替换性。

有关 equals 方法中 getClass() 调用的更详细的描述和示例可以在 Error Prone's check 的文档中找到。

如果名称不能为空,第一个 equals() 应该就足够了。如果 name 可以为 null,则两个变体都不够(第二个 equals 不检查两个名称 == null)。

如果名称(以及对 equals() 起作用的所有字段)是不可变的,您应该查看 Google’s Auto value annotation processor,它提供自动生成 equals()、hashCode() 和 toString()。