2008-09-22 5 views
2

(Java 질문)내부 클래스와 순환 의존성을 어떻게 해결합니까?

내부 클래스의 필드를 참조 할 경우 주변 클래스와 내부 클래스 간의 순환 종속성이 발생합니까?

어떻게 이것을 피할 수 있습니까? 클래스 또는 인터페이스 내부의 어떤 선언이없는 오프

public class Outer { 

    private Other o; 
    private Inner i;  

    public Outer() { 
    o = new Other(); 

    i = new Inner() { 
     public void doSomething() { 
     o.foo(); 
     } 
    }; 

    } 
} 
+0

외부, 기타, 내부 세 가지 클래스가 있습니까? – jjnguy

+0

예, 3 개의 클래스입니다. –

답변

10

: 당신이 정적 내부 클래스를 선언하면 다음 내부 클래스의 인스턴스는 외부 클래스에 대한 참조가 없습니다. 그것이 satic이 아니라면, 내부 객체 efectivelly는 그것을 생성 한 외부 객체를 가리 킵니다 (이것은 암시 적 참조를가집니다. 실제로 생성자에 대한 반사를 사용하면 외부 인스턴스를 수신하기위한 추가 매개 변수가 나타납니다).

내부 인스턴스 포인트 외부 인스턴스 : 순환 참조는 각 인스턴스가 다른 인스턴스를 가리키는 경우에 사용됩니다. 외부 클래스와의 인터페이스를 구현하지 않고 일부 인터페이스를 우아하게 구현하고 개인 필드에 액세스하기 위해 내부 클래스를 사용하는 경우가 많습니다. 내부 인스턴스가 외부 인스턴스를 가리키고 있지만 그 반대를 의미하지는 않습니다. 필요한 순환 참조가 아닙니다.

원 닫기 : 어쨌든 Java의 순환 참조에는 아무런 문제가 없습니다. 객체는 멋지게 작동하며 더 이상 참조되지 않으면 가비지 수집됩니다. 그들이 서로를 지적한다면 그것은 중요하지 않습니다.

0

당신이 예에서 사용하는 구문은 조금 : 여기

은 예입니다. 그러나 예제의 개념에는 아무런 문제가 없습니다. Java에서는 잘 작동합니다.

내가 여기서 무슨 일을하는지 잘 모르겠지만, 당신은 유지 보수에 대한보다 심플한 디자인을 고려하는 것이 좋습니다 등

그것은 부모 클래스의 요소를 참조하는 익명의 이벤트 핸들러에 대한 일반적인 패턴입니다, 이 경우 피할 이유가 없기 때문에 함수 포인터 대신 Java가 설계된 것입니다.

0

런타임시

, 내부 클래스는이 속한 외부 클래스의 인스턴스에 대한 암시 적 참조가 (이 당신이 ... 무엇을 요구하는 경우 확실하지 않음). 따라서 내부 클래스 인스턴스를 전달할 때마다 외부 클래스 인스턴스를 전달합니다.
내부 클래스를 "정적"으로 선언하면 피할 수 있지만 내부 클래스는 외부 클래스의 멤버 변수에 액세스 할 수 없습니다. 따라서 외부 클래스의 멤버에 액세스하려면 명시 적으로 내부 클래스에 전달해야합니다 (setter를 사용하거나 내부 클래스의 생성자 사용). 인스턴스 클래스 대 정적