2016-07-08 5 views
1

:Java Outer Class의 인스턴스가 Java Inner Class의 모든 인스턴스를 호출 할 수있는 방법이 있습니까? 다음 코드와

public class Outer { 
    final int foo; 

    public Outer(int foo) { 
     this.foo = foo; 
    } 

    public Inner createInnerInstance(int bar) { 
     return new Inner(bar); 
    } 

    public int getBarSum() { 
     // TODO: implement 
    } 

    public class Inner { 
     final int bar; 

     public Inner(int bar) { 
      this.bar = bar; 
     } 

     public int getBar() { 
      return bar; 
     } 

     public int getFooPlusBar() { 
      return foo + bar; 
     } 
    } 
} 

나는 모든 Inner에 메소드를 호출 Outer에 메서드를 추가하고 싶습니다. OutergetInnerInstance가 추가하는하는 ListInner의 인스턴스를 유지하는이 일을

한 가지 방법이다. 이 문제는 목록의 내부 인스턴스에 대한 참조가 가비지 수집되지 않도록하려는 것입니다. Java에서 weak-linked List의 일부 형태가 가능합니까?

다른 접근 방법이 있습니까?

참고 : Outer의 특정 인스턴스를 공유하는 Inner만을 찾고 있습니다.

+1

확실히 그들을 목록화할 필요가 있는지 확인하려면 –

+0

매우 나쁜 구현은 외부 클래스에 전역 부울 변수를 추가하고 부울이 변경되었는지 확인하는 내부 클래스 각각에 대한 스레드를 갖는 것입니다. 대신 이러한 각 클래스에 리스너를 추가하고 외부 클래스에서 리스너를 호출 할 수 있습니다. –

+0

@nickzoum 나는 당신이 "각 인스턴스에 대해 레코드를 실제로 보유 할 필요없이 모든 클래스에 신호를 보낼 수있는 방법을 찾기 위해 노력한 것"이라고 인정합니다. - 나는 청취자 접근법에 적합하지 않다고 지적하고 싶다.그러나 그 토론이 OP의 문제에 대답하는 데 도움이되지 않기 때문에 (부분적으로는 오해가 내 측면에 근거합니다) 나는 질문을 혼란스럽게하지 않기 위해 다른 의견을 삭제할 것입니다 (나는 이것을 곧 삭제할 것입니다, 당신이 그것을 읽을 기회를 가졌던 후에)). – Thomas

답변

4

외부 클래스가 내부 클래스에 대한 참조를 얻지 못하면 그 (쉬운) 방법이 없습니다.

외부 클래스를 참조하는 다른 this 참조가있는 내부 클래스를 생각하면 (내부 클래스의 Outer.this을 통해 액세스 할 수 있습니다).

클래스 A가 클래스 B의 인스턴스에 대한 참조를 가지지 만 B의 특정 인스턴스를 참조하는 A의 모든 인스턴스를 찾는 유일한 방법은 반올림하지 않는 경우 A의 모든 인스턴스를 반복하고 해당 인스턴스를 확인하는 것입니다. B 참조. 그리고 그것은 이미 의 모든 부분이 인 A부터 시작합니다.

쉬운 방법은 생성 된 내부 클래스를 추적하는 것입니다. List<Inner>Outer입니다.

예 : Inner 인스턴스가 다시 제거 할 수있는 경우

class Outer { 
    List<Inner> inners = new LinkedList<>(); 

    public Inner createInnerInstance(int bar) { 
    Inner inner = new Inner(bar); 
    inners.add(inner); 
    return inner; 
    } 
} 

당신은 처리해야 할 것이다. 물론 WeakReference, SoftReference 등의 약한 참조를 사용할 수 있습니다. 이 여전히 존재하는 내부 인스턴스를 얻고 싶다면 (참조를 확인해야합니다). 그러나 추가 참조 인스턴스를 사용하는 내부 클래스의 크기에 따라 메모리 사용이 향상되지 않을 수 있으므로주의해서 사용하십시오.