문제

(자바 질문)

내부 클래스의 필드를 참조하면 바깥쪽 클래스와 내부 클래스 사이에 순환 종속성이 발생합니까?

이것을 어떻게 피할 수 있습니까?

예는 다음과 같습니다.

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
도움이 되었습니까?

해결책

정적 클래스와 인스턴스 클래스: 내부 클래스를 정적으로 선언하면 내부 클래스의 인스턴스는 외부 클래스에 대한 참조를 갖지 않습니다.그것이 포화되지 않은 경우 내부 객체는 자신을 생성한 외부 객체를 효과적으로 가리킵니다(암시적 참조가 있으며 실제로 생성자에 대해 리플렉션을 사용하면 외부 인스턴스를 수신하기 위한 추가 매개변수가 표시됩니다).

내부 인스턴스는 외부 인스턴스를 가리킵니다. 순환 참조는 각 인스턴스가 다른 인스턴스를 가리키는 경우입니다.외부 클래스와 인터페이스를 구현하지 않으면서 일부 인터페이스를 우아하게 구현하고 비공개 필드에 액세스하기 위해 내부 클래스를 사용하는 경우가 많습니다.이는 내부 인스턴스가 외부 인스턴스를 가리킨다는 의미이지만 그 반대를 의미하지는 않습니다.순환 참조가 필요하지 않습니다.

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

다른 팁

예제에서 사용하는 구문은 약간 벗어났으며 클래스나 인터페이스 Inner에 대한 선언이 없습니다.그러나 예제의 개념에는 아무런 문제가 없습니다.Java에서는 잘 작동합니다.

여기서 무엇을 하고 있는지 잘 모르겠지만 유지 관리 등을 위해 보다 단순한 디자인을 고려하고 싶을 수도 있습니다.

익명 이벤트 핸들러가 상위 클래스의 요소를 참조하는 것은 일반적인 패턴이므로 이를 피할 이유가 없습니다. 함수 포인터 대신 Java가 설계된 방식입니다.

(이것이 당신이 요구하는 것인지 확실하지 않습니다 ...)

런타임 시 내부 클래스는 자신이 속한 외부 클래스의 인스턴스에 대한 암시적 참조를 갖습니다.따라서 내부 클래스 인스턴스를 전달할 때마다 외부 클래스 인스턴스도 전달하게 됩니다.
내부 클래스를 "정적"으로 선언하면 이를 방지할 수 있지만 이는 내부 클래스가 외부 클래스의 멤버 변수에 액세스할 수 없음을 의미합니다.따라서 이 경우 외부 클래스의 멤버에 액세스하려면 해당 멤버를 명시적으로 내부 클래스에 전달해야 합니다(설정자 또는 내부 클래스의 생성자를 사용).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top