Java的:替代传递“这个”作为构造函数的参数,以引用创建对象(Java: Alternative

2019-08-04 15:18发布

我花了一边想着不同的解决方案,在一个我去,因为我读过左右(我是不是真的与Java又经历),使用此一个构造函数的参数通常不是一个好的做法。

我所试图做的是实例类JobGroupMod的几个对象和每个JobGroupMod我要创建一定数量JobMod对象必须能够引用早在他们已经从催生了JobGroupMod对象。

为了实现这个目标,我路过“这个”的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);
     }
}

我的问题是,是否有解决的更好的方式,或者是我的解决方案的建议的方法是什么?

Answer 1:

你应该尝试使用静态工厂方法( 有效的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;
    }
}


Answer 2:

只要保持你在做的唯一的事情JobGroupMod你了解的后果构造函数是长达相当安全的。 有一个在现实世界中,做这个有很多的Java代码。 它仍然不是你真正想做的事情,尤其是当你开始谈论多线程和并发性的东西。

危险在于传递this到别的对象之前是完全构造。 如果构造是你这样做后,抛出一个异常,并没有完全建立,你可以有一个讨厌的问题。 如果另一个线程来访问您传递的对象this之前它完全构建,你就会有一个讨厌的问题。

你会经常发现在Java中是使用工厂模式来避免这种情况,一个“初始化”类型的方法,或依赖注入的人。



Answer 3:

一般没有魔法。 你可以通过构造通过参数或者稍后使用设定器/ init方法等initalize它

如果您的类JobMod需要参考JobGroupMod ,并已完全离不开它使用构造函数传递。 如果有时它可以站在没有它创建init()方法或setter可以初始化此引用。

BTW有时你必须同时创建参数和默认的构造函数:第一个定期计划的使用,第二,如果你正在使用XML,JSON或会更容易为豆状类等系列化。 在这种情况下,至少创造的javadoc解释是默认的构造函数不应该直接使用。



文章来源: Java: Alternative to passing “this” as constructor argument in order to reference creating object