我想知道Guava与Apache Commons之间关于equals和hashCode构建器的主要区别是什么。

等于:

Apache Commons:

public boolean equals(Object obj) {
    if (obj == null) { return false; }
    if (obj == this) { return true; }
    if (obj.getClass() != getClass()) { return false; }
    MyClass other = (MyClass) obj;
    return new EqualsBuilder()
            .appendSuper(super.equals(obj))
            .append(field1, other.field1)
            .append(field2, other.field2)
            .isEquals();
}

Guava
public boolean equals(Object obj) {
    if (obj == null) { return false; }
    if (obj == this) { return true; }
    if (obj.getClass() != getClass()) { return false; }
    MyClass other = (MyClass) obj;
    return Objects.equal(this.field1, other.field1)
            && Objects.equal(this.field1, other.field1);
}

hashCode :

Apache Commons:
public int hashCode() {
    return new HashCodeBuilder(17, 37)
            .append(field1)
            .append(field2)
            .toHashCode();
}

Guava
public int hashCode() {
    return Objects.hashCode(field1, field2);
}

关键区别之一似乎是使用Guava版本提高了代码可读性。

我从https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained找不到更多信息。知道是否存在更多差异(尤其是性能改进?)会很有用。

最佳答案

我将这种差异称为“存在”。 Apache Commons中有EqualsBuilderHashCodeBuilder,而Guava中没有构建器。从Guava那里获得的只是一个实用程序类MoreObjects(从Objects重命名,因为现在JDK中有这样的类)。

Guava 方法的优点来自于 builder 的不存在:

  • 它不产生垃圾
  • 更快

  • JIT编译器可以通过Escape Analysis以及相关的开销消除垃圾。然后,它们的速度与完全相同的速度一样快。

    我个人认为这些构建器更具可读性。如果您发现更好地使用它们,那么 Guava 无疑是您的正确选择。如您所见,静态方法足以完成任务。

    还请注意,还有一种ComparisonChain,它是一种Comparable-builder。

    关于java - Guava与Apache Commons Hash/Equals构建器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31058353/

    10-13 09:10