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
方法中的forgetClass()
调用文档中可以找到更详细的描述和示例。如果名称不能为null,则第一个equals()就足够了。如果name可以为null,则两个变量都不充分(第二个等于不检查两个name==null)
如果名称(以及所有有助于equals()的字段)是不可变的,那么您应该看看哪个字段提供了equals()、hashCode()和toString()的自动生成。可以
name
benull
?如何@覆盖公共布尔等于(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深入研究了各种类型测试习惯用法及其派生。