Java外部类的实例有没有办法调用Java内部类的所有实例?
使用以下代码:Java外部类的实例有没有办法调用Java内部类的所有实例?,java,android,inner-classes,weak-references,Java,Android,Inner Classes,Weak References,使用以下代码: 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 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添加一个方法,它在每个内部调用一个方法
实现这一点的一种方法是让外部保留一个内部实例列表,getInnerInstance将其附加到该列表中。问题是我不希望列表对内部实例的引用阻止它们被垃圾收集。在Java中是否可以使用某种形式的弱链表
有什么不同的方法吗
注意:我只寻找共享Outer的特定实例的Inners 如果外部类没有得到对内部类的引用,那么就没有简单的方法可以做到这一点 在一个简单的层次上,考虑内部类有另一个this引用,它引用了外部类,您可以在内部类中通过outer.this访问它 如果类A引用了类B的一个实例,但不是相反,那么找到该引用的所有A实例的唯一方法就是遍历A的所有实例并检查它们的B引用。这已经从获取A的所有实例的困难部分开始了 更简单的方法是跟踪所创建的内部类,例如,在外部类中使用列表 例如:
class Outer {
List<Inner> inners = new LinkedList<>();
public Inner createInnerInstance(int bar) {
Inner inner = new Inner(bar);
inners.add( inner );
return inner;
}
}
如果可以再次删除内部实例,则必须处理该问题。当然,您可以使用弱引用,如WeakReference、SoftReference等。如果您只想获得仍然存在的内部实例,则必须检查引用。但是,根据使用其他引用实例的内部类的大小,可能不会导致更好的内存使用,因此请谨慎使用。如果外部类没有获得对内部类的引用,那么就没有简单的方法可以做到这一点 在一个简单的层次上,考虑内部类有另一个this引用,它引用了外部类,您可以在内部类中通过outer.this访问它 如果类A引用了类B的一个实例,但不是相反,那么找到该引用的所有A实例的唯一方法就是遍历A的所有实例并检查它们的B引用。这已经从获取A的所有实例的困难部分开始了 更简单的方法是跟踪所创建的内部类,例如,在外部类中使用列表 例如:
class Outer {
List<Inner> inners = new LinkedList<>();
public Inner createInnerInstance(int bar) {
Inner inner = new Inner(bar);
inners.add( inner );
return inner;
}
}
如果可以再次删除内部实例,则必须处理该问题。当然,您可以使用弱引用,如WeakReference、SoftReference等。如果您只想获得仍然存在的内部实例,则必须检查引用。但是,根据内部类的大小,使用其他引用实例可能不会导致更好的内存使用,因此请谨慎使用。一组weakreference可能会解决您的问题。一组weakreference可能会解决您的问题。也许您可以使用,例如 例如,也许你可以和一位同事一起工作 非常确定,您需要列出它们一个非常糟糕的实现,它是通过向外部类添加一个全局布尔变量,并为每个内部类设置一个线程来检查布尔值是否已更改。您可以为这些类中的每一个添加一个侦听器,并从外部类调用侦听器。@nickzoum我承认这一点,但您说我只是想找到一种方法来向所有类发送信号,而不必为每个实例保存记录。-我想指出的是,这种方法不适合听众。然而,由于讨论无助于回答OP的问题,部分原因是我的误解,我将删除我的其他评论,以免问题变得混乱。在您有机会阅读之后,我也将删除此评论。非常确定,您需要列出它们一个非常糟糕的实现,它是通过向外部类添加一个全局布尔变量,并为每个内部类设置一个线程来检查布尔值是否已更改。您可以为这些类中的每一个添加一个侦听器,并从外部类调用侦听器。@nickzoum我承认这一点,但您说我只是想找到一种方法来向所有类发送信号,而不必为每个实例保存记录。-我想指出的是,这种方法不适合听众。然而,由于讨论无助于回答OP的问题,部分原因是我的误解,我将删除我的其他评论,以免问题变得混乱。在您有机会阅读之后,我也将删除此评论。抱歉,Java 6中也有:抱歉,Java 6中也有: