Самый эффективный способ предотвратить бесконечную рекурсию в toString ()?

Строка на коллекции может попасть в бесконечный цикл, если где-то на графике собранных элементов есть ссылка обратно на себя. Смотрите пример ниже.

Да, хорошая практика кодирования должна предотвращать это в первую очередь, но в любом случае мой вопрос: каков наиболее эффективный способ обнаружения рекурсии в этой ситуации?

Одним из подходов является использование набора в локальном потоке, но это кажется немного тяжелым.

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 !
  }
}

Ответы на вопрос(9)

Ваш ответ на вопрос