如果收集项图中的某处是对其自身的引用,则对集合进行字符串处理可能会陷入无限循环。请参见下面的示例。
是的,良好的编码实践应该首先防止这种情况发生,但无论如何,我的问题是:在这种情况下检测递归的最有效方法是什么?
一种方法是在线程本地使用集合,但这似乎有点沉重。
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 !
}
}
最佳答案
当我必须迭代有风险的图时,我通常会创建一个带有递减计数器的函数。
例如:
public String toString(int dec) {
if ( dec<=0 ) {
return "{skipping recursion}";
} else {
return super.toString(dec-1);
}
}
public String toString() {
return toString(100);
}
我不会坚持这样做,正如您已经知道的那样,但这不符合 toString()
的约定,它必须简短且可预测。
关于java - 防止 toString() 无限递归的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11300203/