Полагаю, это сработает, как описывают ваши тесты.
public boolean isLinkedTo(Link to) {
// start recursion with no currently checked links
return isLinkedTo(to, new HashSet<>());
}
private boolean isLinkedTo(Link to, Set<Link> linksChecked) {
// this link is linked to 'to'
if (links.contains(to)) {
return true;
}
// this link not linked to 'to' so add it to the checked links
linksChecked.add(this);
// check all links to see if the links are linked to 'to'
for (Link link: links) {
// current link not checked yet and current link is linked to 'to'
if (!linksChecked.contains(link) && link.isLinkedTo(to, linksChecked)) {
return true;
}
}
// no links or sub-links are linked to 'to'
return false;
}
Чтобы рекурсивно проверять ссылки с собственной ссылкой без бесконечной рекурсии, вы должны отслеживать, какие ссылки вы уже проверили, чтобы избежать бесконечной проверки одних и тех же ссылок. Вот почему я добавил вспомогательный метод, который отслеживает проверенные ссылки.
Как сказано выше в комментарии Эллиотта, при использовании хэш-набора объектов вы хотите переопределить методы равенства и хэш-кода класса, чтобы гарантировать, что хэш-набор работает должным образом. Большинство идентификаторов могут автоматически сгенерировать для вас действительный хеш-код equals, просто как примечание.