Самый эффективный способ предотвратить бесконечную рекурсию в 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 !
}
}