2016-10-24 3 views
0

나는 혼자서 모든 것을 배우려는 프로그래밍에 아주 익숙하다. 나는 해결할 수없는 문제에 직면하고 있으며 온라인에서 좋은 답변을 찾을 수 없습니다.Java 객체에 대한 순환 참조를 제거하는 방법은 무엇입니까?

인터페이스를 구현하는 일련의 클래스가 있는데 그 중 하나는 다른 유형의 객체에 대한 참조를 제공해야합니다. 아래 코드를 단순화 된 버전으로 게시합니다. 정확하지 않을 수도 있지만 이해할 수 있기를 바랍니다.

내가 게시 한 주 방법과 같은 순환 참조를 제거하는 메서드를 작성할 수 없다는 것이 내 문제입니다. 나는 그래프와 재귀 알고리즘에 대해 많은 것을 읽었지만, 아직 답을 찾을 수 없었다. 어떤 도움을 주시면 감사하겠습니다. 고맙습니다!

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

난 인터페이스 객체의 다른 유형의 참조를 제공해야 중 하나를 구현하는 클래스의 시리즈가있다. 아래 코드를에 게시하면 이 정확하지 않을 수도 있지만 이해해 주시면 감사하겠습니다.

내 문제는 내가 아래 게시 된 주요 방법처럼 순환 참조 이런 종류의 제거 를 얻는 방법을 쓸 수 아니다 것이 무엇입니까.

주의가 필요한 부분이 약간 강조 표시되어 있습니다.

우선 가비지 컬렉터는 개의 수신 가능 객체 인 개체를 수집하고 이러한 참조를 해제합니다. 프로젝트를 컴파일하려고 할 때 프로세스가 매우 유사합니다. 대부분의 경우 모든 소스 파일이 컴파일됩니다. 그러나 가비지 수집과 마찬가지로 몇 가지 예외가 있습니다.

은이 링크에서 봐 주시기 바랍니다 :

How does Java Garbage Collection work with Circular References?

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

나는 정말로 그것이 초보자가 아니기 때문에, 당신은 자바 가비지 컬렉터 알고리즘을 수정하지 않으려는 희망 태스크.

제안 사항 : 자바 가비지 컬렉터 자동 순환 참조 시스템을 사용할 때까지 코드를 수정하십시오.

관련 문제