2

(Java问题)

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

我怎样才能避免这种情况?

这是一个例子:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
4

3 回答 3

10

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

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

结束循环:无论如何,Java 中的循环引用没有任何问题。对象工作得很好,当它们没有被更多引用时,它们就会被垃圾收集。他们是否互相指向都没关系。

于 2008-09-23T01:42:01.753 回答
0

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

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

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

于 2008-09-22T23:58:49.050 回答
0

(不确定这是否是您要问的......)

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

于 2008-09-23T00:49:15.263 回答