(Java问题)
如果我在内部类中引用一个字段,这会导致封闭类和内部类之间的循环依赖吗?
我该如何避免这种情况?
以下是一个例子:
public class Outer {
private Other o;
private Inner i;
public Outer() {
o = new Other();
i = new Inner() {
public void doSomething() {
o.foo();
}
};
}
}
答案 0 :(得分:10)
静态vs实例类:如果将内部类声明为static,则内部类的实例不具有对外部类的任何引用。如果它不是satic那么你的内部对象有效地指向创建它的外部对象(它有一个隐式引用,事实上,如果你对它的构造函数使用反射,你会看到一个额外的参数来接收外部实例)。
内部实例指向外部实例:循环引用以防每个实例指向另一个实例。很多时候,您使用内部类来优雅地实现某些接口和访问私有字段,而不实现与外部类的接口。它确实意味着内部实例点外部实例,但并不意味着相反。不是必需的循环参考。
关闭圈子无论如何,Java中的循环引用没有任何问题。对象运行良好,当它们没有被引用时,它们被垃圾收集。如果他们互相指责并不重要。
答案 1 :(得分:0)
您在示例中使用的语法有点偏离没有类或接口Inner的声明。但是这个例子的概念没有任何问题。在Java中,它可以正常工作。
我不确定你在这里做了什么,但你可能想要考虑一个更简单的可维护性设计等。
这是匿名事件处理程序引用其父类的元素的常见模式,因此没有理由避免它,如果是这种情况,那就是Java的设计方式而不是函数指针。
答案 2 :(得分:0)
(不确定这是不是你要问的......)
在运行时,内部类具有对其所属外部类的实例的隐式引用。因此,每当你传递内部类实例时,你也会传递外部类实例。
您可以通过将内部类声明为“静态”来避免这种情况,但这意味着内部类无法访问外部类的成员变量。因此,在这种情况下,如果要访问外部类的成员,则需要将其显式传递给内部类(使用setter或使用内部类的构造函数)。