Java:具有彼此实例的类
我觉得这是一个非常基本的问题,但我从来没有遇到过这样的情况。现在我有一个这样的结构:Java:具有彼此实例的类,java,Java,我觉得这是一个非常基本的问题,但我从来没有遇到过这样的情况。现在我有一个这样的结构: public class Main{ ClassA a = new ClassA(); ClassB b = new ClassB(a); } 我的ClassA在ClassB以及Main.class中都是必需的。现在我注意到ClassA也必须知道ClassB public class Main{ ClassA a = new ClassA(b); ClassB b = new
public class Main{
ClassA a = new ClassA();
ClassB b = new ClassB(a);
}
我的ClassA
在ClassB
以及Main.class
中都是必需的。现在我注意到ClassA
也必须知道ClassB
public class Main{
ClassA a = new ClassA(b);
ClassB b = new ClassB(a);
}
显然不行。首先,我想到了使用一个观察者模式
,但这对我来说似乎是一种过度的杀伤力,而且它不是通常使用的模式有没有一种方法,我可以使
Main.class
knowClassA.class
&ClassB.class
,也可以使ClassA.class
knowClassB.class
,反之亦然?因为Main.class
也使用ClassA
,所以我必须让同一个类只初始化一次 不需要在构造函数中设置引用。您可以创建一个setter,在创建了两个对象后可以调用它,例如b.setA(a)代码>您可以使用setter方法
添加到您的ClassA
:
public void setB(ClassB b) {
this.b = b;
}
然后:
public class Main{
ClassA a = new ClassA();
ClassB b = new ClassB(a);
a.setB(b);
}
您不需要这些类相互了解,而是需要a
类的a
实例来了解b
类的b
实例
在这种情况下,您可以在ClassA
中创建一个setter,并在构建b
后调用它,也可以使用magic。一些DI框架可以为您实现上述魔力。此类masgic的一个示例是将包装传递到ClassA
的构造函数中,并将包装设置为指向b
后期构造
最后你可以看看你的班级结构。你现在有一个循环依赖,它们通常是不好的东西。例如,ClassA
和ClassB
是否都依赖于一个新的ClassC
(它没有依赖项)?无法同时创建ClassA
和ClassB
实例并将它们传递给彼此的构造函数
您可以在ClassA
中创建一个setter来设置ClassB
实例,在创建两个对象后调用该实例:
ClassA a = new ClassA();
ClassB b = new ClassB(a);
b.setA(a);
但是,对于类的设计来说,需要有两个相互引用的对象这一事实是一个危险信号。这意味着这两个类是紧密耦合的,并且通常是您想要的
如果您可以更改类的设计,这样您就不需要像这样的循环依赖关系,这会更好。也许您应该将它们设置为一个类,或者您可以添加一个表示ClassA
和ClassB
对象之间链接的附加类-例如,保存对a
和b
对象的引用的ClassC
哪种解决方案是合适的取决于你到底在做什么;如果没有更多关于您实际情况的信息,很难判断。这是一个循环依赖,您应该避免它为什么不分配它?首先声明b
,然后将a
赋值给其中的变量。您不必将其放入构造函数中。就像Rehman
所说的,这是一个有保证的内存泄漏,因为这两个对象始终指向对方,除非其中一个对象显式设置为null
,否则它们都不会被垃圾收集。对此,有几种解决方案。你应该告诉我们更多关于你的用例的信息,这样我们就可以找到最有意义的东西。我觉得忘记这个选项几乎是愚蠢的。。。非常感谢。