Я сожалею, что прыгнул поздно с критикой, но никто больше не упомянул об этом, и здесь есть серьезный недостаток . Возможно два, на самом деле.
Во-первых, другие упоминали, как обрабатывать возможность нулевого, но один критический элемент хорошей пары методов hashcode()
и equals()
заключается в том, что они должны подчиняться контракту, а ваш код выше этого не делает.
Контракт заключается в том, что объекты, для которых equals()
возвращает true, должны возвращать равные значения хеш-кода , но в вашем классе выше поля id и roleName независимы.
Это крайне ошибочная практика: вы можете легко иметь два объекта с одинаковым значением roleName, но разными значениями id.
Практика состоит в том, чтобы использовать те же поля для генерации значения хеш-кода, которые используются методом equals (), и в том же порядке. Ниже моя замена для вашего метода хэш-кода:
public int hashCode () {
return ((roleName==null) ? 0 : roleName.hashcode());
}
Примечание: я не знаю, что вы намеревались использовать в поле id в качестве хеш-кода, или что вы хотели сделать с полем id. Я вижу из аннотации, что он сгенерирован, но он извне сгенерирован, поэтому записанный класс не выполняет контракт.
Если по какой-то причине вы окажетесь в ситуации, когда этот класс исключительно управляется другим, который точно генерирует значения "id" для roleNames, которые выполняют контракт, у вас не будет проблем с функциональностью , но это все равно будет плохой практикой или, по крайней мере, иметь то, что люди называют «запахом кода». Помимо того факта, что в определении класса нет ничего, что могло бы гарантировать, что класс можно использовать только таким образом, хеш-коды не являются идентификаторами, поэтому идентификаторы не являются хеш-кодами .
Это не значит, что вы не можете использовать идентификатор с гарантированным равным для равных значений rolename-значений в качестве хеш-кода, но они концептуально не совпадают, поэтому, по крайней мере, , у вас должен быть блок комментария, чтобы объяснить ваш отход от ожидаемой практики.
И, как хорошее общее правило, если вам придется это делать, вы, вероятно, допустили ошибку проектирования. Не всегда, но возможно. Одна из причин этого? Люди не всегда читают комментарии, поэтому, даже если вы создадите отлично функционирующую систему, со временем кто-то «злоупотребит» вашим классом и вызовет проблемы.
Отсутствие этого позволяет самому классу управлять генерацией значений хеш-кода. И вы все равно можете сохранить и сделать доступным внешний сгенерированный идентификатор, для какой бы цели вы его не использовали.