Соответственно, мой вопрос, правильно ли я реализовал методы equals / hashCode?
Прежде всего: "что правильно?" ... можно задаться вопросом, почему дерево должно реализовывать equals()
и hashCode()
в первую очередь. Особенно сложен hashCode()
: смысл этого метода (главным образом) в том, что вы можете сохранить соответствующий объект в HashMap / HashSet. Но это поднимает большой красный флаг: оба этих класса не любят, когда hashCode()
возвращает разные значения с течением времени. И это именно то, что будет делать ваш код: каждый раз, когда вы меняете свое дерево (добавляя / удаляя узел), hashCode()
будет давать другой результат.
Итак, мы могли бы взглянуть на то, что делают стандартные библиотеки: и там мы находим JTree ..., который не реализует оба метода! С другой стороны, когда мы смотрим в сторону AbstractSet (который является базовым классом для TreeSet), мы обнаруживаем, что оба метода реализованы и включают члены. Так что оба пути кажутся верными.
Возвращаясь к вопросу: это действительно зависит от того, как вы хотите , чтобы эти два метода работали. Одинаково ли два дерева, если они имеют одинаковое содержание (имеется в виду: имеет ли значение порядок детей)?
Короче говоря: если вы хотите убедиться, что все данные равны и что все дочерние элементы равны и в том же порядке, то ваша реализация кажется правильной.
И да, это ограничение для проверки только этих двух атрибутов имеет большой смысл: когда вы включаете родительскую ссылку, вы сразу получаете рекурсию, которая не может быть нарушена.
Наконец: вы пометили этот вопрос JUnit. Это подразумевает, что вы подумаете о написании тестов для своего производственного кода. Тогда эти тесты должны ответить на ваш вопрос. Значение: одним из подходов будет то, что вы садитесь и определяете контракт для этих двух методов. И затем вы создаете несколько тестовых случаев, которые проверяют все аспекты этих контрактов. И тогда ваши контрольные примеры сообщают вам, соответствует ли ваш производственный код вашему контракту.
Я думаю, что это ключевой момент: нет универсального правила, которое говорит нам, если / как реализовать equals()
и hashCode()
для класса Tree. Вы должны изучить ваши требования, если / как это сделать. Затем вы выводите тесты из этих знаний, которые затем применяете для проверки соответствия данной реализации требованиям / контракту.