10

我花了一段时间思考不同的解决方案,因为我已经阅读过(我对 Java 还没有真正的经验),使用它作为构造函数参数通常不是一个好习惯。

我要做的是实例化几个 JobGroupMod 类的对象,并且对于每个 JobGroupMod 我必须创建一定数量的 JobMod 对象,这些对象必须能够引用它们从中产生的 JobGroupMod 对象。

为了实现这一点,我将“this”传递给 JobMod 构造函数,但即使工作,它也感觉不像是正确的设计。

public class JobGroupMod implements JobGroup {

    public JobGroupMod(Node n,Set<Job> clusterJobs){
        JobMod j=new JobMod(n,this);
    }
}

现在是 JobMod 类:

public class JobMod implements Job {
     public JobMod(Node n, JobGroup jg){
         setJobGroup(jg);
     }
}

我的问题是,有没有更好的方法来解决这个问题,或者我的解决方案是建议的方法?

4

3 回答 3

7

您应该尝试使用静态工厂方法(有效的 Java 链接)。

这样可以避免传入this构造函数调用,至少可以说这是非常不明智的。
示例代码:

public class JobGroupMod implements JobGroup {

    public static JobGroupMod createModeMod(Node n, Set<Job> clusterJobs) {
        JobGroup jg = new JobGroupMod();
        JobMod j = new JobMod(n, jg);
        return jg;
    }
}
于 2012-12-24T17:11:54.917 回答
5

只要它仍然是您在JobGroupMod构造函数中所做的唯一事情,只要您了解其后果,就相当安全。现实世界中有很多 Java 代码可以做到这一点。这仍然不是您真正想做的事情,尤其是当您开始谈论多线程和并发时。

在对象完全构造之前,危险正在传递this给其他事物。如果构造函数在你这样做之后抛出异常并且没有完全构造,你可能会遇到一个讨厌的问题。this如果另一个线程要在完全构造之前访问您传递给它的对象,那么您将遇到一个令人讨厌的问题。

您在 Java 中经常会发现人们使用工厂模式来避免这种情况,使用“init”类型方法或依赖注入。

于 2012-12-24T17:09:05.040 回答
0

一般没有魔法。您可以通过构造函数传递参数,也可以稍后使用 setter/init 方法等对其进行初始化。

如果您的类JobMod需要引用JobGroupMod并且与它无关,则使用构造函数传递它。如果有时它可以在没有它的情况下创建init()可以初始化此引用的方法或设置器。

顺便说一句,有时您必须同时创建参数化构造函数和默认构造函数:首先用于常规编程使用,其次如果您使用 XML、JSON 或其他更容易用于类 bean 类的序列化。在这种情况下,至少创建解释不应直接使用默认构造函数的 javadoc。

于 2012-12-24T17:07:28.647 回答