создание hashCode и равно для Address - PullRequest
0 голосов
/ 17 сентября 2011

Мне нужно реализовать equals() and hashCode() для класса Address.

Я считаю, что ненулевые поля используются для определения hashCode () и equals (). В моем приложении любое из полейза исключением того, что addressLine1 и country могут быть нулевыми. Если это так, что произойдет, если два разных адреса имеют одинаковую адресную строку1 и страну?

Address1:(in state of NH which is omitted by user)
addressline1:111,maple avenue
country: US

Address2:
addressline1:111,maple avenue
state: Illinois
country: US

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

Это правильный способ создания hashCode?

int hash = addressline.hashCode();
if(addressLine2!=null){
   hash += addressLine2.hashCode();
}
and so on...

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Обычно вы проверяете, является ли один нулем, а другой нет в вашем методе equals.Для хэш-кода вы просто должны использовать 0 в качестве нулевого хеш-кода.Пример:

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((addressLine1 == null) ? 0 : addressLine1.hashCode());
    result = prime * result + ((state == null) ? 0 : state.hashCode());
    result = prime * result + ((country == null) ? 0 : country.hashCode());
    return result;
}

Если вы используете IDE, она обычно генерирует их для вас.В eclipse выберите Source, Generate equals и hashcode, и он позволит вам выбрать поля, которые вы хотите включить в методы equals и hashcode.Для метода equals и ваших полей, это то, что создает eclipse:

public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    YourClass other = (YourClass) obj;
    if (addressLine1 == null) {
        if (other.addressLine1 != null) return false;
    } else if (!addressLine1.equals(other.addressLine1)) return false;
    if (country == null) {
        if (other.country != null) return false;
    } else if (!country.equals(other.country)) return false;
    if (state == null) {
        if (other.state != null) return false;
    } else if (!state.equals(other.state)) return false;
    return true;
}

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

1 голос
/ 17 сентября 2011

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

this.addressline==null ? other.addressline==null : this.addressline.equals(other.addressline)

Для хеш-кодов используйте те же поля, которые вы использовали в равенствах, но вы можете рассматривать нулевые значения как наличие хеш-кода0 (или любое другое значение хеш-кода).

Вот канонический вопрос:

Какие проблемы следует учитывать при переопределении equals и hashCode в Java?

И здесь обсуждаются библиотеки, которые помогут вам правильно реализовать эти методы:

Apache Commons equals / hashCode builder (также обсуждается Guava)

...