(Java问题)

如果我在内部类中引用一个字段,这会导致封闭类和内部类之间的循环依赖吗?

我该如何避免这种情况?

以下是一个例子:

public class Outer {

  private Other o;
  private Inner i;    

  public Outer() {
    o = new Other();

    i = new Inner() {
      public void doSomething() {
        o.foo();
      }
    };

  }
}
有帮助吗?

解决方案

静态vs实例类:如果将内部类声明为static,则内部类的实例不具有对外部类的任何引用。如果它不是satic那么你的内部对象有效地指向创建它的外部对象(它有一个隐式引用,事实上,如果你在它的构造函数上使用反射,你会看到一个额外的参数来接收外部实例)。

内部实例指向外部实例:循环引用以防每个实例指向另一个实例。很多时候,您使用内部类来优雅地实现某些接口和访问私有字段,而不实现与外部类的接口。它确实意味着内部实例点外部实例,但并不意味着相反。不是必需的循环参考。

关闭圈子无论如何,Java中的循环引用没有任何问题。对象运行良好,当它们没有被引用时,它们被垃圾收集。如果他们互相指责并不重要。

其他提示

您在示例中使用的语法有点偏离没有类或接口Inner的声明。但是这个例子的概念没有任何问题。在Java中,它可以正常工作。

我不确定你在这里做了什么,但你可能想考虑一个更简单的可维护性设计等。

这是匿名事件处理程序引用其父类的元素的常见模式,因此没有理由避免它,如果是这种情况,那就是Java的设计方式而不是函数指针。

(不确定这是不是你要问的......)

在运行时,内部类具有对其所属外部类的实例的隐式引用。因此,每当您传递内部类实例时,您也会传递外部类实例 您可以通过将内部类声明为“静态”来避免这种情况,但这意味着内部类无法访问外部类的成员变量。因此,在这种情况下,如果要访问外部类的成员,则需要将其显式传递给内部类(使用setter或使用内部类的构造函数)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top