Java:具有彼此实例的类

时间:2015-11-25 13:54:46

标签: 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 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 ,因此我必须将同一个类初始化一次。

4 个答案:

答案 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)

无法同时创建ClassAClassB个实例,并将它们传递给彼此的构造函数。

你可以做的是在ClassA中创建一个setter来设置ClassB实例,你在创建两个对象后调用它:

ClassA a = new ClassA();
ClassB b = new ClassB(a);
b.setA(a);

但是,您需要有两个相互引用的对象,这与类的设计有关。这意味着这两个类紧密耦合,通常你需要loose coupling

如果你可以改变你的课程设计,这样你就不需要像这样的循环依赖,这样会更好。也许你应该只让它们成为一个类,或者你可以添加一个代表ClassAClassB对象之间链接的附加类 - 例如一个ClassC来保存对{的引用{1}}和a个对象。

哪种解决方案适当取决于您正在做什么;如果没有关于你实际情况的更多信息,很难说清楚。

答案 3 :(得分:0)

您不需要彼此了解这些类,而是需要ClassA b ClassB实例来了解ClassA b实例。

在这种情况下,您可以在ClassA中创建一个setter,并在构建b后调用它,或者您可以使用 magic 。一些DI框架可以为您实现所谓的魔力。这种masgic的一个例子是将包装器传递给ClassA的构造函数,并将包装器设置为指向ClassB后构造。

最后你可以看看你的班级结构。您目前有一个循环依赖,它们通常都是坏事。例如,ClassC和{{1}}是否都依赖于新的{{1}}(没有依赖关系)?