如何解决内部类的循环依赖?
时间: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中的循环引用无论如何都没有错。对象运行良好,当它们不被更多引用时,它们将被垃圾回收。他们是否指向对方并不重要。