写等于方法
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()。
第一个是否对所有情况都足够,还是我应该使用第二个更好? 我都试过了,得到了相同的结果,但也许有我没有尝试的情况。
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()。