Нужна помощь в написании хэш-кода и метода equals? - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть класс, который дает подробную информацию об оплате. Атрибуты

    accountNo, transactionAmount, dateOfTransaction.

Здесь я хочу написать хеш-функцию так, чтобы она работала, когда я храню объекты этого класса в hashSet.

Основным ограничением является то, что реквизиты платежа должны быть уникальными (предположим, что конкретное лицо не должно платить комиссию дважды в месяц).

Может ли кто-нибудь помочь мне написать хэш-код для этого сценария, а также метод equals?

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

Я предлагаю вам использовать hashcodebuilder пакета apache commons:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/HashCodeBuilder

Существует также EqualsBuilder:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/EqualsBuilder

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

3 голосов
/ 06 сентября 2011

Вам нужно решить точно что вы подразумеваете под равенством. В частности, вы говорите о том, что не платите дважды за месяц - означает ли это, что одна транзакция должна быть равна другой, если она в том же месяце, даже если она в другой день? Это звучит довольно странно - и очень специфично для использования, а не для типа - идея равенства. Также обратите внимание, что транзакция имеет только один номер счета - конечно, он должен иметь как «от», так и «к» счету, так как могут быть платежи от нескольких человек на один счет, и может быть платежи с одного счета на нескольких счетов в одном месяце.

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

Я бы настоятельно рекомендовал бы прочитать раздел Джоша Блоха о равенстве в Effective Java (второе издание) для получения более подробной информации, но equals обычно будет выглядеть примерно так:

@Override public boolean equals(Object other)
{
    if (other == null || other.getClass() != this.getClass())
    {
        return false;
    }
    BankTransaction otherTransaction = (BankTransaction) other;

    return accountNo == otherTransaction.accountNo 
        && transactionAmount == otherTransaction.transactionAmount
        && // etc;
}

Обратите внимание, что для любого поля, имеющего тип reference , вам необходимо определить, какое равенство вы хотите применить там - часто вы захотите вызвать equals вместо того, чтобы просто использовать ссылку сравнение предоставлено ==.

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

Окончательный ответ на этот вопрос в Effective Java (второе издание) .

...