Java:自动equals()和hashCode()

时间:2011-08-05 16:10:30

标签: java equals hashcode

为简单数据实施equals()hashCode() POJO使我的代码混乱,维护很繁琐。

有哪些库自动处理?
由于性能原因,我更喜欢字节码检测而不是AOP方法。

更新:已经讨论了实现equals()和hashCode()的必要性,这是我的观点:

以最小的努力提前完成它而不是深入研究代码,添加hC / eq是不是更好?

5 个答案:

答案 0 :(得分:12)

Project Lombok提供了注释@EqualsAndHashCode,它将为您的Java类生成equals()hashCode()。当然,与手动实现这些方法相比,存在一些缺点,因此请务必阅读链接页面上的“小字体”。

答案 1 :(得分:3)

答案 2 :(得分:2)

您可以使用Google的 AutoValue 库自动生成equalshashCode的不可变值类。这些值类有点类似于Scala的案例类或Lombok生成的类。

还有一个关于如何在IDE中使用它的post

答案 3 :(得分:1)

Apache commons-lang库有一个HashCodeBuilder和EqualsBuilder,它将为您完成一些工作并缩短这些方法。甚至有反射版本可以根据POJO中的字段为您完成所有操作。但是,我不建议这样做。反思可能很慢(虽然没有许多想象的那么糟糕),你应该实现它们以确保只考虑正确的字段是否相等。

我的问题是,你真的需要这样做吗?通常只需要实现POJO上的hashcode和equals以用于Maps或Sets。对于地图,通常您会使用ID作为密钥,而不是Pojo本身。那么,......你在为自己工作吗?

答案 4 :(得分:1)

Java 7及更高版本

虽然不是您所要求的灵丹妙药,但从Java 7和更高版本开始,编写hashCode替代项现在变得容易一些。

Objects.hashCodeObjects.hash

从Java 7开始,Objects类提供了一些用于生成哈希码值的实用程序方法。

有关其他问题,请参见my Answer,以进行更多讨论。

单个成员,不容忍NULL

@Override
public int hashCode() {
    return this.member.hashCode() ;  // Throws NullPointerException if member variable is null.
}

单个成员,可以容忍NULL

@Override
public int hashCode() {
    return Objects.hashCode( this.member ) ;  // Returns zero (0) if `this.member` is NULL, rather than throwing exception.
}

多成员

@Override
public int hashCode() {
    return Objects.hash( this.memberA , this.memberB , this.memberC  ) ;  // Hashes the result of all the passed objects’ individual hash codes.  
}