2012-12-09 93 views
4

我有一个类,本质上是这样的:Java调用构造函数多次

class Child extends Parent { 
    public void reinitialize() { 
    super(); // illegal 
    } 
} 

基本上,我想再次调用构造函数重新初始化。我不能将初始化代码重构为自己的方法,因为Parent是我无法修改源的库类。

有没有办法做到这一点?

+0

你想重新初始化父母或小孩吗? – PermGenError

+0

创建一个'initialize()'方法,它执行你的构造函数当前所做的事情。然后,你的构造函数和'reinitialize()'都应该简单地调用'initialize()'。 – Vulcan

+0

@Gan:孩子(所以我可以改为调用this()')。 Vulcan:如前所述,由于没有“Parent”来源,我无法重构。 – Xodarap

回答

7

不,没有办法做到这一点。即使在JVM字节码级别,也可以在任何给定的对象上最多调用一次连续的方法(构造函数)。

通常的答案是将代码重构为普通的实例方法,但正如您所说,这是不可能的。

您可以做的最好的办法是找到一种重新设计的方法,以避开重新初始化的需要。或者,如果您需要在父构造函数中存在特定行为,则可以自己复制它。

+0

您可以遵循“支持组合继承”(​​Effective Java)的设计原则,从而使得Child具有* Parent(组合),而不是* *(继承)。这样,你可以用新实例交换父对象,从而调用构造函数。 – Andy

+0

包含在重构选项下。我假设OP由于库设计而无法做到这一点。 – Antimony

+0

据我了解,他/他不能改变'Parent',但'Child'是他自己写的子类。 – Andy

1

执行此操作的一种方法是提供一个返回新的Child对象的静态方法。或者,您可以简单地在客户端代码中创建一个新的子对象。无论哪种方式,这听起来像你将无法重用现有的对象。

3

这个唯一的解决办法是要么

  • 创建新的对象每次需要“重新intialise”它的时间。
  • 使用委托而不是继承,即使您必须同时使用两者。通过使用委托,您可以替换实例。
  • 创建一个与父构造函数完全相同的重新初始化方法。例如如果必须,请使用反射来替换字段或清除集合。
0

有几种方法可以实现这一点。其中之一是创建另一种方法,例如“init”。这个“init”方法应该从构造函数或者reinitialize方法中调用。

+0

谢谢,但正如问题中提到的,我无法修改父类的构造函数。 – Xodarap