Java 写相等方法

Java 写相等方法,java,equals,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 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 Objects.equals(name, test.name);
如果
name
为空,这只会避免NPE


不要在
equals
检查中使用
getClass()
:这违反了子类的Liskov可替换性


equals
方法中的for
getClass()
调用文档中可以找到更详细的描述和示例。

如果名称不能为null,则第一个equals()就足够了。如果name可以为null,则两个变量都不充分(第二个等于不检查两个name==null)


如果名称(以及所有有助于equals()的字段)是不可变的,那么您应该看看哪个字段提供了equals()、hashCode()和toString()的自动生成。

可以
name
be
null
?如何
@覆盖公共布尔等于(Object obj){If(this==obj){return true;}If(obj==null){return false;}if(getClass()!=obj.getClass()){return false;}final Test other=(Test)obj;return Objects.equals(this.name,other.name);}
@NPE yes name可以是null@YCF_L这与上面的第二个equals方法相同。如果在equals中使用
getClass
,那么如果
obj
是一个子类,它将不起作用。这违反了Liskov的可替代性。Angeliker Langer深入研究了各种类型测试习惯用法及其派生。