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
know
ClassA.class
&
ClassB.class
,也可以使
ClassA.class
know
ClassB.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
,否则它们都不会被垃圾收集。对此,有几种解决方案。你应该告诉我们更多关于你的用例的信息,这样我们就可以找到最有意义的东西。我觉得忘记这个选项几乎是愚蠢的。。。非常感谢。