Реализация `hashCode()` для очень простых классов

StackOverflow https://stackoverflow.com/questions/496779

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть очень простой класс только с одним элементом поля (напримерСтрока).Можно ли это реализовать hashCode() чтобы просто вернуться fieldMember.hashCode()?Или я должен каким-то образом манипулировать хэш-кодом поля?Кроме того, если я должен манипулировать этим, то почему это так?

Это было полезно?

Решение

Если fieldMember - довольно хороший способ уникальной идентификации объекта, я бы сказал "да".

Другие советы

Джошуа Блох рассказывает, как правильно переопределить equals и hashCode в "Эффективной Java" Глава 3.

Умножение, добавление или упорядочивание элементов не сделает его более уникальным.Математически вы бы применяли постоянные функции к одной переменной, что не увеличивает количество возможных значений переменной.

Такого рода техника полезна для объединения нескольких хэшкодов и при этом сохраняет риск столкновений относительно небольшим;это не имеет никакого отношения ни к одному хэш-коду.

Да, это довольно стандартно.И если класс отражает строку базы данных, я просто возвращаю первичный ключ.

Есть только два реальных требования к hashCode:один, который equals экземпляры имеют одинаковые хэш-коды, и два, которые hashCode бегает достаточно быстро.Первое требование является наиболее важным на практике;без этого вы могли бы поместить что-то в коллекцию, но не найти это там.Вторая - это просто проблема с производительностью.

Если алгоритм хэш-кода вашего поля соответствует приведенному выше, то его алгоритм также работает для вашего класса, если ваш класс equals также зависит исключительно от того, являются ли эти поля equals.

Если переменная 'fieldMember' уже реализует функцию 'hashCode', то вы можете использовать ее непосредственно из вашего родительского класса.Если переменная 'fieldMember' является экземпляром пользовательского класса, то вы должны правильно реализовать ее самостоятельно.Читать java.lang.Объект Документация API в качестве руководства по реализации "hashCode".

Ya.Это хорошая практика программирования.Обычно я использую:

возвращает значение var ^ 1;

Обычно, если вы не используете этот объект в качестве ключа для * HashMap или элемента в * HashSet , hashCode() переопределять не нужно.

Как уже упоминал кто-то другой, вы должны следовать советам в Effective Java.Если вы переопределяете метод hashCode(), вы также должны переопределять метод equals().Кроме того, эти два метода должны быть согласованными.

Чтобы упростить написание хороших методов equals() и hashCode(), я использую Эквалсбилдер и Создатель хэш - кода из Apache Commons Lang

Вот примеры:

public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    User other = (User) o;
    return new EqualsBuilder()
            .append(this.getUniqueId(), other.getUniqueId())
            .isEquals();
}

public int hashCode() {
    return new HashCodeBuilder()
            .append(this.getUniqueId())
            .toHashCode();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top