2016-07-08 56 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; 
     } 
    } 
} 

我想一個方法添加到Outer它要求每個Inner的方法。這樣做的

一種方法是Outer保持InnerList一個實例,這getInnerInstance追加到。問題在於我不希望列表對內部實例的引用使它們不被垃圾收集。在Java中會有某種形式的弱鏈接列表嗎?

有什麼不同的方法嗎?

注意:我只查找Inner s,它們共享Outer的特定實例。

+1

很確定你需要列出它們 –

+0

這是一個非常糟糕的實現,通過向外部類添加一個全局布爾變量併爲每個檢查布爾值是否已更改的內部類都有一個線程。您可以添加一個偵聽器到這些類中的每一個,並從外部類調用偵聽器。 –

+0

@nickzoum我承認,但你說過「我只是想找到一種方法來發信號通知所有的類,而不必爲每個實例保存記錄。」 - 我想指出的不符合聽者的方法。然而,由於討論無助於回答OP的問題(部分原因是基於我的誤解),爲了避免混淆問題,我將刪除其他評論(我將很快刪除這些內容,在你有機會閱讀之後))。 – Thomas

回答

4

如果外部類沒有得到內部類的引用,那麼沒有(簡單)的方法來做到這一點。

在簡單的層面上,想到內部類有另一個引用外部類的this引用(您可以通過內部類中的Outer.this訪問它)。

如果A類引用了B類的一個實例,但是沒有其他方法找到所有引用B的特定實例的實例的唯一方法就是迭代A的所有實例並檢查它們B參考。並且這已經開始於難以獲得全部個實例A.

更簡單的方法是跟蹤創建的內部類,例如,在Outer內有List<Inner>

例子:

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

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

如果Inner實例可以再次刪除,你不得不處理這個問題。當然你可以使用較弱的引用,如WeakReference,SoftReference等,如果你只是想獲得仍然存在的內部實例(你必須檢查引用)。但是,根據內部類的大小,使用其他參考實例可能不會導致更好的內存使用,因此請謹慎使用。

相關問題