为简单数据实施equals()
和hashCode()
POJO使我的代码混乱,维护很繁琐。
有哪些库自动处理?
由于性能原因,我更喜欢字节码检测而不是AOP方法。
更新:已经讨论了实现equals()和hashCode()的必要性,这是我的观点:
以最小的努力提前完成它而不是深入研究代码,添加hC / eq是不是更好?
答案 0 :(得分:12)
Project Lombok提供了注释@EqualsAndHashCode,它将为您的Java类生成equals()
和hashCode()
。当然,与手动实现这些方法相比,存在一些缺点,因此请务必阅读链接页面上的“小字体”。
答案 1 :(得分:3)
答案 2 :(得分:2)
您可以使用Google的 AutoValue 库自动生成equals
和hashCode
的不可变值类。这些值类有点类似于Scala的案例类或Lombok生成的类。
还有一个关于如何在IDE中使用它的post。
答案 3 :(得分:1)
Apache commons-lang库有一个HashCodeBuilder和EqualsBuilder,它将为您完成一些工作并缩短这些方法。甚至有反射版本可以根据POJO中的字段为您完成所有操作。但是,我不建议这样做。反思可能很慢(虽然没有许多想象的那么糟糕),你应该实现它们以确保只考虑正确的字段是否相等。
我的问题是,你真的需要这样做吗?通常只需要实现POJO上的hashcode和equals以用于Maps或Sets。对于地图,通常您会使用ID作为密钥,而不是Pojo本身。那么,......你在为自己工作吗?
答案 4 :(得分:1)
虽然不是您所要求的灵丹妙药,但从Java 7和更高版本开始,编写hashCode
替代项现在变得容易一些。
Objects.hashCode
和Objects.hash
从Java 7开始,Objects
类提供了一些用于生成哈希码值的实用程序方法。
有关其他问题,请参见my Answer,以进行更多讨论。
hashCode
(和equals
)替代基于您的班级中的单个成员,请使用Objects.hashCode( member )
。 hashCode
(和equals
)替代基于您课程的多个属性,请使用Objects.hash( memberA , memberB , memberC )
。 @Override
public int hashCode() {
return this.member.hashCode() ; // Throws NullPointerException if member variable is 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.
}