Я согласен с комментарием I82, так как вам следует избегать ссылки B на своих родителей: это дублирование информации, которое обычно приводит только к проблемам, но вам, возможно, потребуется сделать это в вашем случае.
Даже еслиВы оставляете родительскую ссылку в B
, что касается хэш-кодов, вы должны полностью игнорировать родительскую ссылку и использовать только внутренние переменные true из B
для построения хэш-кода.
A
s являются просто контейнерами, и их значение полностью определяется их содержимым, которое является значениями содержащихся B
s, как и их хеш-ключи.
ЕслиA
- неупорядоченный набор, вы должны быть очень осторожны, чтобы хеш-код, который вы строите из значений B
(или B
хеш-кодов), не зависел от некоторого порядка.Например, если хеш-код создается путем добавления и умножения хеш-кодов содержащихся B
в некоторой последовательности, вы должны сначала упорядочить хеш-коды по возрастанию, прежде чем вычислять результат сумм / умножений.Точно так же A.equals(o)
не должен зависеть от порядка B
s (если неупорядоченный набор).
Обратите внимание, что если вы используете java.util.Collection
в A
, то просто исправьте B
хэш-код с игнорированием родительской ссылки автоматически даст действительные A
хеш-коды, поскольку Collection
по умолчанию имеют хорошие хэш-коды (упорядоченные или нет).