我是一个非常新的编程,试图自己学习它。我面临一个我无法解决的问题,我在网上找不到任何好的答案。
我有一系列实现接口的类,其中一个类需要提供对任何其他类型对象的引用。我在下面发布了我的代码的简化版本,我知道它可能不完全正确,但我希望你能理解它。
我的问题是我无法编写一个方法来摆脱这些循环引用,就像我在下面发布的主要方法中一样。我读了很多关于图形和递归算法的东西,但我还没找到答案。任何帮助,将不胜感激。谢谢!
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);
}
答案 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垃圾收集器自动循环参考免费系统。