如何解决内部类的循环依赖?

时间:2020-03-06 14:34:20  来源:igfitidea点击:

(Java问题)

如果我引用内部类中的字段,这是否会导致封闭类与内部类之间的循环依赖?

如何避免这种情况?

这是一个例子:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}

解决方案

我们在示例中使用的语法有点差,没有类或者接口Inner的声明。但是示例的概念并没有错。在Java中,它将正常工作。

我不确定我们在这里做什么,但是我们可能要考虑采用更简单的设计来实现可维护性等。

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

(不确定这是否是我们要的内容...)

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

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

内部实例指向外部实例:如果每个实例都指向另一个实例,则使用循环引用。很多时候,我们使用内部类来优雅地实现某些接口并访问私有字段,而不使用外部类来实现接口。它确实意味着内部实例指向外部实例,但并不意味着相反。不需要循环引用。

结束循环:Java中的循环引用无论如何都没有错。对象运行良好,当它们不被更多引用时,它们将被垃圾回收。他们是否指向对方并不重要。