【发布时间】:2011-06-09 10:53:41
【问题描述】:
我们通过将大部分构造函数代码移至onInitialize() 来避免此 PMD 警告。但是我们只是将问题(设计缺陷?)转移到不同的地方吗?
即我们的onInitialize() 只是一个代理构造函数,PMD 没有注意到吗?
当您在构造函数中调用可覆盖的方法时,我们遇到了那种弹出的问题,但这似乎源于 Wicket 本身调用了一个(找不到确切的源代码行,但onInitialize(),一个可覆盖的方法,当你在构造函数中调用 add() 时最终会被调用)。
如果有帮助,很乐意提供示例代码。
public class PageA extends WebPage {
protected SomeBean bean;
public PageA() {
add(new Label("foo", "bar"));
bean = new SomeBean();
}
}
public class PageB extends PageA {
public PageB() {
super();
}
@Override
protected void onInitialize() {
add(new Label("rofl", bean.getSomeText()));
}
}
您会认为这很好,但对onInitialize 的调用不会发生在您认为会发生的地方:
在页面调用add()时,方法流程为:
MarkupContainer add()
MarkupContainer addedComponent()
Page componentAdded()
MarkupContainer initialize()
Component fireInitialize()
Component onInitialize()
因此,您可以看到,如果您将组件添加到 WebPage,onInitialize() 方法将被触发,这是一个可覆盖的方法,导致上述看起来正常的代码实例创建 NullPointerExceptions。
你得到的唯一警告是onInitialize()的JavaDoc:
注意:此调用的时间不准确,约定是在 {@link Component#onBeforeRender()} 之前的某个时间调用它。
【问题讨论】:
-
是的,对我来说这听起来像是一个设计缺陷。尽管如此,提供一些具体的东西还是很好的。
-
如果您仔细阅读 Wicket 论坛 (apache-wicket.1842946.n4.nabble.com/…),您会发现这是一个公认且备受争议的问题。