kotlin - 如何覆盖哈希码

kotlin - how to override hashcode

我已经覆盖了 java 对象的 equals 方法。 (实际上是 kotlin 中的对象,但它很容易理解,我只是重写了 equals 方法)。但现在为了维护 equals 合同,我还应该重写 hashcode 方法。但我不确定如何为适合 equals 方法的哈希码实现。这是我目前所拥有的:

    data class AddressModel(
        var id_address: Int = 0,
        var id_country: Int = 0,
) {

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is AddressModel)
            return false
        else {
            if (other.id_address == this.id_address)
                return true
        }
        return false
    }
}

编译器强烈建议我覆盖 hashCode 方法。但我不明白要实施什么。在 equals override 中,我只是想检查 addressModel 是否与另一个具有相同的 Id,如果有,那么我假设它是相等的。

这是我目前所拥有的:

override fun hashCode(): Int {
        return Objects.hash(id_address, id_country);
    }

但我认为这样更好:

override fun hashCode(): Int {
            return Objects.hash(id_address); //base hash off same as equals the id_address
        }

这是我推荐的阅读方式,但它是什么意思?如果我添加了更多 class 字段,我是否还需要向 Objects.hash 方法添加更多字段?我更喜欢旧的 skool 方式来做,因为这个调用需要 android api 19 并且我支持更低的 (api 16).

需要说明的是,我知道如果我不重写 hashcode 和 equals,那么每个实例,例如"new AddressModel(707, 867)",将具有不同的哈希码。然后 HashMap 例如会认为这些对象是不同的并且不等于在计算存储哈希时替换它们。但我只是不知道在 hashCode 实现中放什么。你可以用 kotlin 或 java 告诉我没问题。

更新:这是否足够:

override fun hashCode(): Int { return id_address.hashCode() }

Sample POJO class (dataVO) overrides hashcode and equals, @Data : Lombok

有用的链接:

https://www.geeksforgeeks.org/override-equalsobject-hashcode-method/

Why do I need to override the equals and hashCode methods in Java?

https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/

 @Data

    public class dataVO implements Serializable {

    private static final long serialVersionUID = 1L;
    private int id;
    private String name;

   public String toString(){ 
          return "name:"+name;  
    }  
  @Override
    public boolean equals(Object obj) {
       if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
     if (your logic) {
        return true; 
     }
     else {
       return false;
     }
   }

    @Override
    public int hashCode() {
        return id;
    }
}

因为您的#equals() 只依赖于id_address,所以它应该用于哈希码计算。我更喜欢:

override fun hashCode() = Objects.hash(id_address)