我花了一边想着不同的解决方案,在一个我去,因为我读过左右(我是不是真的与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);
}
}
我的问题是,是否有解决的更好的方式,或者是我的解决方案的建议的方法是什么?
你应该尝试使用静态工厂方法( 有效的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;
}
}
只要保持你在做的唯一的事情JobGroupMod
你了解的后果构造函数是长达相当安全的。 有一个在现实世界中,做这个有很多的Java代码。 它仍然不是你真正想做的事情,尤其是当你开始谈论多线程和并发性的东西。
危险在于传递this
到别的对象之前是完全构造。 如果构造是你这样做后,抛出一个异常,并没有完全建立,你可以有一个讨厌的问题。 如果另一个线程来访问您传递的对象this
之前它完全构建,你就会有一个讨厌的问题。
你会经常发现在Java中是使用工厂模式来避免这种情况,一个“初始化”类型的方法,或依赖注入的人。
一般没有魔法。 你可以通过构造通过参数或者稍后使用设定器/ init方法等initalize它
如果您的类JobMod
需要参考JobGroupMod
,并已完全离不开它使用构造函数传递。 如果有时它可以站在没有它创建init()
方法或setter可以初始化此引用。
BTW有时你必须同时创建参数和默认的构造函数:第一个定期计划的使用,第二,如果你正在使用XML,JSON或会更容易为豆状类等系列化。 在这种情况下,至少创造的javadoc解释是默认的构造函数不应该直接使用。
文章来源: Java: Alternative to passing “this” as constructor argument in order to reference creating object