Ответ
Технически можно, но это считается серьезным антипаттерном для большинства случаев, так как нарушает эффективность работы hash-коллекций (HashMap, HashSet, ConcurrentHashMap).
Проблемы:
- Вырождение производительности: Все объекты будут иметь один хеш-код и попадать в один бакет (bucket). Коллекция вырождается в связный список, и операции
get(),put()деградируют с O(1) до O(n). - Контракт
equals-hashCode: Он не нарушается, если реализацияequalsтакже считает все объекты равными. Контракт требует: еслиequals()возвращаетtrue, тоhashCode()должен быть одинаковым. Обратное не требуется.
Допустимые (но редкие) случаи использования:
- Класс-синглтон, где существует только один экземпляр.
- Неизменяемый (immutable) класс, все экземпляры которого логически равны.
- Когда производительность не важна, а объекты используются крайне редко.
Пример (антипаттерн):
@Override
public int hashCode() {
return 1; // Все объекты этого класса будут иметь один хеш-код.
}
Вывод: Избегайте этого подхода. Используйте стандартные алгоритмы (например, Objects.hash()) для генерации хорошего, распределенного хеш-кода.