2008-09-22 143 views
2

(Java问题)如何解决内部类的循环依赖问题?

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

我该如何避免这种情况?

下面是一个例子:

public class Outer { 

    private Other o; 
    private Inner i;  

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

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

    } 
} 
+0

外面,其他,内心你是说有三个班级? – jjnguy 2008-09-22 23:49:48

回答

10

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

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

关闭圆:无论如何,Java中循环引用没有任何问题。对象很好地工作,当他们没有更多的引用,他们收集垃圾。如果他们指向对方,这并不重要。

0

您使用的示例中的语法是有点偏离不存在的类或接口内蒙古声明。但是这个例子的概念没有任何问题。在Java中它会正常工作。

我不知道你在这里做什么,但你可能要考虑可维护性更简单的设计等

它是匿名的事件处理程序引用他们的父类的元素一个共同的模式,所以没有理由避免它,如果是这样的话,这就是Java的设计,而不是有功能指针。

0

(不知道这是你在问什么......)

在运行时,内部类的外部类的实例属于一个隐含的参考。所以,无论何时传递内部类实例,您也都要传递外部类实例。
您可以通过将内部类声明为“静态”来避免这种情况,但这意味着内部类无法访问外部类的成员变量。所以在这种情况下,如果您想访问外部类的成员,您需要将其明确传递给内部类(使用setter或使用内部类的构造函数)。