Najbardziej skuteczny sposób zapobiegania nieskończonej rekursji w toString ()?

Ciąg na kolekcji może dostać się do nieskończonej pętli, jeśli gdzieś na wykresie zebranych elementów jest odniesienie do siebie. Zobacz przykład poniżej.

Tak, dobre praktyki kodowania powinny przede wszystkim temu zapobiec, ale moim zdaniem pytanie brzmi: jaki jest najbardziej skuteczny sposób wykrycia rekurencji w tej sytuacji?

Jednym ze sposobów jest użycie zestawu w wątku, ale to wydaje się trochę ciężkie.

public class AntiRecusionList<E> extends ArrayList<E> {
  @Override
  public String toString() {
    if (  /* ???? test if "this" has been seen before */ ) {
        return "{skipping recursion}";
    } else {
        return super.toString();
    }
  }
}


public class AntiRecusionListTest {
  @Test
  public void testToString() throws Exception {
      AntiRecusionList<AntiRecusionList> list1 = new AntiRecusionList<>();
      AntiRecusionList<AntiRecusionList> list2 = new AntiRecusionList<>();
      list2.add(list1);
      list1.add(list2);
      list1.toString();  //BOOM !
  }
}

questionAnswers(9)

yourAnswerToTheQuestion