【问题标题】:Is there a way for an instance of a Java Outer Class to call all its instances of a Java Inner Class?有没有办法让 Java 外部类的实例调用其所有 Java 内部类的实例?
【发布时间】:2016-07-08 08:46:08
【问题描述】:

使用以下代码:

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 保留Inner 实例的ListgetInnerInstance 附加到该实例。这样做的问题是我不希望列表对内部实例的引用来防止它们被垃圾收集。在 Java 中是否可以使用某种形式的弱链表?

有什么不同的方法吗?

注意:我只寻找共享Outer 特定实例的Inners。

【问题讨论】:

  • 很确定你需要列出它们
  • 一个非常糟糕的实现是通过向外部类添加一个全局布尔变量并为每个内部类设置一个线程来检查布尔值是否已更改。您可以改为为这些类中的每一个添加一个侦听器,并从外部类调用该侦听器。
  • @nickzoum 我承认这一点,但你说“我只是想找到一种方法来向所有类发出信号,而实际上不必为每个实例保存记录。” - 我想指出不适合听众的方法。但是,由于该讨论无助于回答 OP 的问题(它部分是基于我这边的误解),我将删除我的其他 cmets 以免使问题混乱(我也会尽快删除它,在你有机会阅读它之后;))。

标签: java android inner-classes weak-references


【解决方案1】:

如果外部类没有获得对内部类的引用,那么就没有(简单的)方法可以做到这一点。

在一个简单的层面上,想想内部类有另一个引用外部类的this 引用(您可以通过内部类中的Outer.this 访问它)。

如果 A 类引用了 B 类的一个实例,但反之则不然,找到所有引用 B 特定实例的 A 实例的唯一方法是遍历 A 的所有实例并检查它们的 B参考。这已经从获取 A 的所有个实例的困难部分开始了。

更简单的方法是跟踪创建的内部类,例如List<Inner> 内有 Outer

例子:

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

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

如果Inner 实例可以再次删除,您必须处理它。当然,如果您只想获得仍然存在的内部实例(您必须检查引用),您可以使用较弱的引用,例如WeakReferenceSoftReference 等。但是,根据内部类的大小,使用额外的引用实例可能不会导致更好的内存使用,因此请谨慎使用。

【讨论】:

    【解决方案2】:

    WeakReferences (https://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html) 的集合可能会解决您的问题。

    【讨论】:

    【解决方案3】:

    也许您可以使用WeakReferences,例如WeakHashMap

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多