如何在toString Java方法中处理递归?

时间:2016-11-27 07:47:07

标签: java recursion tostring

我的程序结构如下:一个表示原子概念的类,它本质上是一个String,另一个类由一般概念列表组成。这两个类扩展了类Concept,它是一个抽象类,这意味着在列表中我可以将原子概念和概念交叉任意嵌套。 每个概念,原子或组合,都是通过toString方法打印出来的。 粗略地说,这是基于这种无上下文语法:

C : atom | (C and)+ C

其中 C 是抽象类Concept, atom 是AtomicConcept,(C和)+ C 是交集。

这是AtomicConcept类:

public class AtomicConcept extends Concept{

private String atomicConceptName;

public AtomicConcept(String c) {
    this.atomicConceptName = c;
}

@Override
public String toString() {
    return atomicConceptName;
   }

}

这是概念交流课程:

import java.util.List;

public class ConceptIntersection extends Concept{

private List<Concept> list;

public ConceptIntersection(List<Concept> l) throws Exception {
    if(l.size()>1)
    {
        this.list = l;
    }
    else
    {
        throw new Exception("Intersection needs at least two concepts!");
    }
   }

public String toString()
{
    return Utils.conceptIntersection + Utils.lparen + Utils.splitConcepts(list) + Utils.rparen;

}

}

正如您在toString函数中看到的,我还创建了一个名为 splitConcepts 的方法,该方法接收输入一般概念的列表,并返回由逗号分隔的每个概念组成的一个字符串。

public static String splitConcepts(List<Concept> list)
{
    String result = "";
    for (Concept item : list) {
        System.out.println(item);
        result += item.toString() + comma;

    }
    result = result.substring(0, result.length() - 1);
    return result;
}

问题出在哪里? 我在使用这个函数时遇到了麻烦,因为当我在另一个函数中调用嵌套的交集时,这个函数永远不会结束

一个例子:

public static void main(String[] args) throws DLRException {
    // TODO Auto-generated method stub

    AtomicConcept atom = new AtomicConcept("one");
    AtomicConcept at = new AtomicConcept("two");
    List<Concept> list = new LinkedList<Concept>();
    list.add(at);
    list.add(atom);
    DLRConceptIntersection intersection = new DLRConceptIntersection(list);
    System.out.println(intersection); // works fine
    list.add(intersection);
    DLRConceptIntersection intersection2 = new DLRConceptIntersection(list);
    System.out.println(intersection2); //loop never ends!
}

解决此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

你有一个循环引用:

['50', '40']

这会导致DLRConceptIntersection intersection = new DLRConceptIntersection(list); list.add(intersection); 的List包含对intersection引用的同一实例的引用,这就是intersection遇到无限递归的原因。

我假设您不打算toString()intersection分享相同的intersection2

如果您在List构造函数中创建List的副本,则可以避免使用它:

DLRConceptIntersection