Java:如何写equals()更短

eri*_*ork 12 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);
        }

}
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 12

Google的guava库具有处理nullness 的ObjectsObjects#equal.它确实有助于缩小规模.用你的例子,我会写:

@Override public boolean equals(Object other) {
  if (!(other instanceof Id)) {
    return false;
  }
  Id o = (Id) other;
  return Objects.equal(this.name, o.name);
}
Run Code Online (Sandbox Code Playgroud)

文档在这里.

还要注意的是有Objects#hashCodeObjects#toStringHelper帮助hashCode,并toString为好!

另请参阅Effective Java 2nd Edition了解如何编写equals().


卢声远*_* Lu 10

如果您使用Eclipse,请单击" Source " - >" generate hashCode()和equals() ".有很多选项可以自动创建equals().

  • 根据我的经验,生成的内容往往与课程不同步.但这并不是一个好的代码审查无法解决的问题.而且我认为手写的很容易出现同样的问题. (3认同)

sbl*_*ndy 9

有些图书馆会为你做这件事.例如,commons-lang有EqualsBuilder

此外,这两行似乎做同样的事情:

            if (o == null)
                    return false;
            if (null == (Id) o)
                    return false;
Run Code Online (Sandbox Code Playgroud)

也许你这意味着:

            if (o == null)
                    return false;
            if (this == o)
                    return true;
Run Code Online (Sandbox Code Playgroud)