Java:如何写equals()更短

时间:2011-01-05 04:16:37

标签: java

当我必须编写近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);
        }

}

5 个答案:

答案 0 :(得分:12)

Google的guava库有ObjectsObjects#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#hashCodeObjects#toStringHelper也有hashCodetoString的帮助!

另请参阅Effective Java 2nd Edition on how to write equals()

答案 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);
}