Java可以帮助我避免equals()中的样板代码吗?

Rog*_*son 10 java equals boilerplate

我实现了Java 7方式的equals():

@Override
public boolean equals(Object obj)
{
    if (this == obj) return true;
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    MyClass other = (MyClass) obj;
    return Objects.equal(myFirstField, other.myFirstField) &&
           Objects.equal(mySecondField, other.mySecondField);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法减少代码重复?

我更喜欢类似的东西

@Override
public boolean equals(Object obj)
{
    if (Objects.equalsEarlyExit(this, obj)) return Objects.equalstEarlyExitResult(this, obj);
    MyClass other = (MyClass) obj;
    return Objects.equal(myFirstField, other.myFirstField) &&
           Objects.equal(mySecondField, other.mySecondField);
}
Run Code Online (Sandbox Code Playgroud)

或类似的.

sla*_*vik 2

您可以使用org.apache.commons.lang.builder.EqualsBuildercommons-lang

例子:

public boolean equals(Object other) {
    return org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals(this, other);
}
Run Code Online (Sandbox Code Playgroud)

其他例子:

private boolean equalsHelper(Object obj) {
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    return true;
}


public boolean equals(Object obj) {

    if (this == obj) return true;

    if(!equalsHelper(ob)) {
      return false;
    }

    MyClass other = (MyClass) obj;
    return new EqualsBuilder()
      .append(myFirstField, other.myFirstField)
      .append(mySecondField, other.mySecondField).isEquals()
}
Run Code Online (Sandbox Code Playgroud)