如何摆脱对Java对象的循环引用?

时间:2016-10-24 20:18:54

标签: java object recursion graph circular-reference

我是一个非常新的编程,试图自己学习它。我面临一个我无法解决的问题,我在网上找不到任何好的答案。

我有一系列实现接口的类,其中一个类需要提供对任何其他类型对象的引用。我在下面发布了我的代码的简化版本,我知道它可能不完全正确,但我希望你能理解它。

我的问题是我无法编写一个方法来摆脱这些循环引用,就像我在下面发布的主要方法中一样。我读了很多关于图形和递归算法的东西,但我还没找到答案。任何帮助,将不胜感激。谢谢!

public class ReferenceObject implements A {

    A reference;

    public void setReference(A reference){
        this.reference=reference;
    }

    public Object getValue(){
        return reference.getValue;
    }

}

public static void main(String[] args) {
    ReferenceObject r1 = new ReferenceObject();
    ReferenceObject r2 = new ReferenceObject();
    ReferenceObject r3 = new ReferenceObject();
    r1.setReference(r2);
    r2.setReference(r3);
    r3.setReference(r1);
}

2 个答案:

答案 0 :(得分:0)

你的案子很简单:

public class ReferenceObject implements A {

  A reference;

  public void setReference(A reference) {
    this.checkForCircularRef(reference);
    this.reference=reference;
  }

  public Object getValue(){
    return reference.getValue;
  }

  private void checkForCircularRef(A reference) {
    if(reference != null) {
      A nextRef = reference;

      while(nextRef != null) {
        if(nextRef.equals(this)) {
          throw new IllegalArgumentException("Reference refers back to this object!");
        }

        nextRef = reference.reference;
      }
    }
  }

}

checkForCircularRef方法实质上是对调用对象(this)的引用进行线性搜索。更复杂的结构可能需要更复杂的搜索。

如果您的对象具有预先存在的循环引用,您可能需要将引用保留在数据结构中,并检查您是否没有看到之前遇到的每个引用,或者我提供的代码将被卡在infinte中循环。

答案 1 :(得分:0)

  

我有一系列实现接口的类,其中一个需要提供对任何其他类型对象的引用我在下面发布了我的代码的简化版本,我知道   可能不完全正确,但我希望你能理解它。

     

我的问题是我无法编写获得的方法   摆脱这种循环引用就像在我的主要方法中一样   张贴在下面。

有点突出了需要注意的事情。

第一件事是Java垃圾收集器它将收集可达对象,它将释放这些引用。 当您尝试编译项目时,该过程非常相似。在大多数情况下,所有源文件都是编译的。但是有一些例外,与垃圾收集相同。

请看一下这个链接:

How does Java Garbage Collection work with Circular References?

How does Java garbage collector deals with circular references when their access path is broken?

我真的希望你不想修复Java垃圾收集器算法,因为它不是一个初学者的任务。

我的建议是:修改你的代码,直到你完全使用Java垃圾收集器自动循环参考免费系统。