Java:Automatic equals() 和 hashCode() Objects.hashCode & Objects.hash

2022-09-02 01:33:58

对于简单的数据,POJO的实现和POJO会使我的代码变得混乱,维护也很乏味。equals()hashCode()

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

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

用最少的工作量提前完成它不是更好,而不是在代码中挖掘,在涉及它时添加hC / eq?

编辑2022年:我已经切换到 Kotlin。Kotlin 负责 Java 的大部分样板,请参阅此页面以了解以下情况:https://tedblob.com/kotlin-data-class/equals()


答案 1

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


答案 2

Objects.hashCode & Objects.hash

虽然不是您请求的灵丹妙药,但从Java 7及更高版本开始,编写覆盖现在要容易一些。hashCode

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

有关更多讨论,请参阅我对相关问题的答案。

单个成员,不容忍 NULL

@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.  
}

推荐