В Java у меня есть подкласс Vertex
класса Java3D Point3f
. Теперь Point3f
вычисляет equals()
на основе значений его координат, но для моего Vertex
класса я хочу быть более строгим: две вершины равны, только если они являются одним и тем же объектом. Пока все хорошо:
class Vertex extends Point3f {
// ...
public boolean equals(Object other) {
return this == other;
}
}
Я знаю, что это нарушает контракт equals()
, но, поскольку я буду сравнивать только вершины с другими вершинами, это не проблема.
Теперь, чтобы иметь возможность помещать вершины в HashMap
, метод hashCode()
должен возвращать результаты, соответствующие equals()
. В настоящее время он делает это, но, вероятно, его возвращаемое значение основывается на полях Point3f
, и, следовательно, будет давать коллизии хеш-функций для различных Vertex
объектов с одинаковыми координатами.
Поэтому я хотел бы основывать hashCode()
на адресе объекта, а не вычислять его из полей Vertex
. Я знаю, что класс Object
делает это, но я не могу вызвать его метод hashCode()
, потому что Point3f
переопределяет его.
Итак, на самом деле мой вопрос двоякий:
- Должен ли я вообще хотеть такого мелкого
equals()
?
- Если да, то как мне получить адрес объекта для вычисления хеш-кода?
Редактировать: Я просто подумал о чем-то ... Я мог бы генерировать случайное значение int
при создании объекта и использовать его для хэш-кода. Это хорошая идея? Почему (нет)?