簡體   English   中英

如何擺脫對Java對象的循環引用?

[英]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垃圾收集器的訪問路徑斷開時,如何處理循環引用?

我確實希望您不要修復Java垃圾收集器算法,因為它不是一個初學者。

我的建議是: 修改代碼,直到使用Java垃圾收集器自動循環引用免費系統為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM