我觉得这是一个非常基本的问题,但我从未遇到过这样的情况。现在我有这样的结构:
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);
}
。
Observer Pattern
显然行不通。首先我想到使用Main.class
,但这似乎对我来说太过分了,除了它不是通常使用的模式。
有没有办法,我可以让ClassA.class
知道ClassB.class
& ClassA.class
,以及ClassB.class
知道Main.class
,反之亦然?由于ClassA
使用mklink settings.xml C:\MyProj\install\settings\Env-Local.xml
,因此我必须将同一个类初始化一次。
答案 0 :(得分:7)
您不需要在构造函数中设置引用。您可以创建一个setter,在您创建了b.setA(a);
这两个对象之后,您可以调用它。
答案 1 :(得分:3)
你可以使用setter方法
添加到您的public void setB(ClassB b) {
this.b = b;
}
:
public class Main{
ClassA a = new ClassA();
ClassB b = new ClassB(a);
a.setB(b);
}
然后:
SELECT
ORIGIN as shipper,
COUNT(BILL_NUMBER) as count_per_week,
WEEK_ISO(CREATED_TIME) as week
FROM
TLORDER
WHERE
ORIGIN = 'ROCKMURTN'
AND CREATED_TIME >= CURRENT TIMESTAMP - 1 YEAR
GROUP BY
ORIGIN ,
WEEK_ISO(CREATED_TIME)
ORDER BY
ORIGIN ,
WEEK_ISO(CREATED_TIME)
答案 2 :(得分:2)
无法同时创建ClassA
和ClassB
个实例,并将它们传递给彼此的构造函数。
你可以做的是在ClassA
中创建一个setter来设置ClassB
实例,你在创建两个对象后调用它:
ClassA a = new ClassA();
ClassB b = new ClassB(a);
b.setA(a);
但是,您需要有两个相互引用的对象,这与类的设计有关。这意味着这两个类紧密耦合,通常你需要loose coupling。
如果你可以改变你的课程设计,这样你就不需要像这样的循环依赖,这样会更好。也许你应该只让它们成为一个类,或者你可以添加一个代表ClassA
和ClassB
对象之间链接的附加类 - 例如一个ClassC
来保存对{的引用{1}}和a
个对象。
哪种解决方案适当取决于您正在做什么;如果没有关于你实际情况的更多信息,很难说清楚。
答案 3 :(得分:0)
您不需要彼此了解这些类,而是需要ClassA
b
ClassB
实例来了解ClassA
b
实例。
在这种情况下,您可以在ClassA
中创建一个setter,并在构建b
后调用它,或者您可以使用 magic 。一些DI框架可以为您实现所谓的魔力。这种masgic的一个例子是将包装器传递给ClassA
的构造函数,并将包装器设置为指向ClassB
后构造。
最后你可以看看你的班级结构。您目前有一个循环依赖,它们通常都是坏事。例如,ClassC
和{{1}}是否都依赖于新的{{1}}(没有依赖关系)?