[英]How to get rid of circular references to java objects?
我是編程新手,試圖自己學習所有這些。 我遇到一個我無法解決的問題,也無法在網上找到任何好的答案。
我有一系列實現接口的類,其中一個需要提供對任何其他類型的對象的引用。 我在下面發布了我的代碼的簡化版本,我知道它可能並非全部正確,但希望您能理解。
我的問題是,我無法編寫一種擺脫這種循環引用的方法,就像我在下面發布的主要方法中那樣。 我讀了很多關於圖和遞歸算法的東西,但是我還找不到答案。 任何幫助,將不勝感激。 謝謝!
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);
}
您的情況很簡單:
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
)的引用。 更復雜的結構可能需要更復雜的搜索。
如果您的對象具有預先存在的循環引用,則可能需要將引用保留在數據結構中,並檢查是否沒有看到以前遇到的每個引用,否則我提供的代碼將陷入無限循環。
我有一系列實現接口的類 ,其中一個需要提供對任何其他類型的對象的引用 。 我在下面發布了我的代碼的簡化版本 ,我知道它可能並非全部正確,但希望您能理解。
我的問題是, 我無法編寫一種擺脫這種循環引用的方法,就像我在下面發布的主要方法中那樣。
有點突出了imo需要注意的地方。
第一件事是Java垃圾收集器將收集可訪問的對象,並釋放這些引用。 當您嘗試編譯項目時,過程非常相似。 在大多數情況下,所有源文件都會被編譯。 但是有少數例外,與垃圾回收相同。
請查看以下鏈接:
我確實希望您不要修復Java垃圾收集器算法,因為它不是一個初學者。
我的建議是: 修改代碼,直到使用Java垃圾收集器自動循環引用免費系統為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.