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中也有: