【发布时间】:2012-07-02 19:48:18
【问题描述】:
如果收集项目图表中的某处是对自身的引用,则集合上的字符串可能会进入无限循环。请参阅下面的示例。
是的,良好的编码实践应该首先防止这种情况发生,但无论如何,我的问题是:在这种情况下检测递归的最有效方法是什么?
一种方法是在线程本地使用集合,但这似乎有点重。
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 !
}
}
【问题讨论】:
-
看看Lombok。它允许您使用
@ToString(exclude={"fields", "you","dont", "want"})注释您的类。 :) -
我自己从来没有遇到过这种情况,但这样的事情可能会很痛苦,因为它只有在您打开 log4j(或类似的)调试时才会发生。因此,您尝试调试问题并最终遇到记录器消息本身的问题 - 非常烦人! +1 回答我的问题
-
@davidfrancis - 日志和调试正是出现的地方!干杯。