2016-10-24 21 views
0

私はそれをすべて自分で学習しようとするプログラミングにはとても新しいです。私は解決できない問題に直面しており、私はオンラインで良い答えを見つけることができませんでした。Javaオブジェクトへの循環参照を取り除くにはどうすればいいですか?

私はインターフェイスを実装する一連のクラスを持っています。そのうちの1つは、他のタイプのオブジェクトへの参照を提供する必要があります。私は以下のコードを簡略化して掲載していますが、それはすべて正しいとは限りませんが、あなたが理解できることを願っています。

私が問題にしているのは、私が下記のメインメソッドのような循環参照を取り除くメソッドを書くことができないことです。私はグラフや再帰アルゴリズムについて多くのことを読んでいますが、まだ答えは見つけられませんでした。どんな助けもありがとう。ありがとうございました!

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

循環参照を取り除く必要はありません。 r1〜r3が範囲外になると、それらはガベージコレクションされます。 – markspace

+0

私はあなたの必要性を理解していません。何を実装しようとしていますか? – davidxxx

+0

あなたは[グラフのサイクルを検出している](http://stackoverflow.com/questions/261573/best-algorithm-for-detecting-cycles-in-a-directed-graph)について話していますか? – azurefrog

答えて

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ループ。

+0

ありがとう!ちょっと変わって、私はこれを手に入れました。 :) –

0

Iはインターフェイス、オブジェクトの他のタイプのいずれかへの参照を提供する必要がのいずれかを実装するクラスのシリーズを持っています。 私はの下に私のコードの簡略化されたバージョンを掲示しています、私はそれが を知っているかもしれませんが、あなたはそれを理解することを願っています。

私の問題は、私は私 は下記掲載mainメソッドのように循環参照のこれらの種類を取り除く を取得するメソッドを記述することはできませんよことは何ですか。

注意が必要なものは少し強調表示されています。

まず、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ガーベジコレクタ自動循環参照フリーシステムが正常に機能するまで、コードを変更してください。

関連する問題