4

我有一个基本上像这样的课程:

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

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

有没有办法做到这一点?

4

4 回答 4

7

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

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

您能做的最好的事情就是找到一种重新设计的方法来解决重新初始化的需要。或者,如果您需要父构造函数中的特定行为,您可以自己复制它。

于 2012-12-09T20:08:56.877 回答
3

解决此问题的唯一方法是

  • 每次需要“重新初始化”它时创建一个新对象。
  • 使用委托而不是继承,即使您必须同时使用两者。通过使用委托,您可以替换实例。
  • 创建一个 re-initialise 方法,它与父构造函数做很多相同的事情。例如替换字段或清除集合,如果必须使用反射。
于 2012-12-09T20:23:49.803 回答
1

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

于 2012-12-09T20:08:43.367 回答
0

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

于 2012-12-10T12:55:28.680 回答