java - 防止 toString() 无限递归的最有效方法?

标签 java recursion 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 !
  }
}

最佳答案

当我必须迭代有风险的图时,我通常会创建一个带有递减计数器的函数。

例如:

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/

相关文章:

python - 递归中的全局变量。 Python

flutter - 如何使用具有全选和取消全选功能的三态复选框实现 TreeView

javascript - {}.toString() 未捕获语法错误 : Unexpected token

java - NTLM Windows 身份验证

java - 递归字符串越界

java - Time2Test(带用户输入)

java - 具有可调整数组大小的 toString 方法

java - Java中的单链表——get()方法

java - 蓝杰错误 : "Incompatible types: int cannot be converted java.lang.String" AND "Incompatible types: java.lang.String cannot be converted to int"

java - Spring 4 + Hibernate 5 = org.springframework.orm.jpa.EntityManagerHolder 无法转换为 org.springframework.orm.hibernate5.SessionHolder