2016-07-08 95 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等,如果你只是想获得仍然存在的内部实例(你必须检查引用)。但是,根据内部类的大小,使用其他参考实例可能不会导致更好的内存使用,因此请谨慎使用。

相关问题