kotlin - как переопределить хеш-код - PullRequest
0 голосов
/ 17 октября 2018

Я переопределил метод equals объекта Java.(на самом деле объекты в kotlin, но его легко понять, я просто переопределяю метод equals).но теперь, чтобы сохранить контракт равных, я должен также переопределить метод хэш-кода.но я не уверен, как вставить реализацию для хэш-кода, который подходит для метода 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 я просто хочу проверить, имеет ли 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
        }

это рекомендуемый способ чтения, но что это значит?если бы я добавил больше полей класса, мне нужно было бы также добавить больше полей в метод Objects.hash?я бы предпочел старый способ skool сделать это, так как этот вызов требует Android Api 19 и я поддерживаю более низкий (API 16).

, чтобы быть понятным, я понимаю, что если я не переопределить хэш-код вместе с равно, токаждый экземпляр, например «new AddressModel (707, 867)», будет иметь свой хеш-код.и тогда HashMap, например, будет думать, что эти объекты различны и не равны, чтобы заменить их при вычислении хеша для хранилища.но я просто не знаю, что положить в реализацию hashCode.Вы можете показать мне либо в Kotlin или Java, все в порядке.

обновление: будет ли этого достаточно:

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Поскольку ваш #equals () зависит только от id_address, его следует использовать в вычислениях хеш-кода.Я бы предпочел:

override fun hashCode() = Objects.hash(id_address)
0 голосов
/ 17 октября 2018

Образец класса POJO (dataVO) переопределяет хэш-код и равен @Data: Lombok

Полезные ссылки:

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

Почему мне нужно переопределить методы equals и hashCode в 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;
    }
}
...