当我必须编写近10行代码来说2 Objects are equal, when their type is equal and both's attribute is equal
时,我感到头疼。您可以很容易地看到,通过这种写作方式,行数随着属性数量的增加而大幅增加。
public class Id implements Node {
private String name;
public Id(String name) {
this.name = name;
}
public boolean equals(Object o) {
if (o == null)
return false;
if (null == (Id) o)
return false;
Id i = (Id) o;
if ((this.name != null && i.name == null) || (this.name == null && i.name != null))
return false;
return (this.name == null && i.name == null) || this.name.equals(i.name);
}
}
答案 0 :(得分:12)
Google的guava库有Objects
类Objects#equal
来处理null。它确实有助于缩小规模。用你的例子,我会写:
@Override public boolean equals(Object other) {
if (!(other instanceof Id)) {
return false;
}
Id o = (Id) other;
return Objects.equal(this.name, o.name);
}
文档为here。
另请注意,Objects#hashCode
和Objects#toStringHelper
也有hashCode
和toString
的帮助!
答案 1 :(得分:10)
如果您使用Eclipse,请点击“来源” - > “生成hashCode()和equals()”。有很多选项可以自动创建equals()。
答案 2 :(得分:9)
有些图书馆会为你做这件事。例如,commons-lang有EqualsBuilder
此外,这两行看起来也是一样的:
if (o == null)
return false;
if (null == (Id) o)
return false;
也许你的意思是:
if (o == null)
return false;
if (this == o)
return true;
答案 3 :(得分:4)
Project Lombok还有一个使用equals
注释的hashCode
和@EqualsAndHashCode
生成器,它具有与当前类/源代码同步的优势。我不确定实施细节,但绝对值得研究一下,如果你需要减少这个问题。
答案 4 :(得分:1)
一种更简单的方法(除了生成代码之外)可能是。
public boolean equals(Object o) {
return o instanceof Id
&& (name == null ? ((Id)o).name == null : name.equals(((Id)o).name);
}