Java:将“this”作为构造函数参数传递以引用创建对象的替代方法

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

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

为了实现这一目标,我将“this”传递给JobMod构造函数,但即使工作,也感觉不适合设计。

public class JobGroupMod implements JobGroup { public JobGroupMod(Node n,Set clusterJobs){ JobMod j=new JobMod(n,this); } } 

现在是JobMod类:

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

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

您应该尝试使用静态工厂方法( Effective Java link )。

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

 public class JobGroupMod implements JobGroup { public static JobGroupMod createModeMod(Node n, Set clusterJobs) { JobGroup jg = new JobGroupMod(); JobMod j = new JobMod(n, jg); return jg; } } 

只要你了解其结果,只要你在JobGroupMod构造函数中做的唯一事情是相当安全的。 现实世界中有很多Java代码可以做到这一点。 它仍然不是你真正想做的事情,特别是当你开始讨论multithreading和并发时。

在物体完全构造之前,危险就是将其传递给其他东西。 如果构造函数在执行此操作后抛出exception而未完全构造,则可能会出现令人讨厌的问题。 如果另一个线程在完全构造之前访问了你传递给它的对象,你就会遇到一个令人讨厌的问题。

您经常在Java中找到的是使用工厂模式来避免这种情况的人,“init”类型方法或dependency injection。

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

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

BTW有时您必须创建参数化和默认构造函数:第一个用于常规编程用法,第二个用于使用XML,JSON或其他序列化,这对于类似bean的类更容易。 在这种情况下,至少创建javadoc,解释不应该直接使用默认构造函数。