我们通过将大部分构造函数代码移动到onInitialize()
. 但是我们只是将问题(设计缺陷?)转移到不同的地方吗?
即我们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()
被触发,这是一个可覆盖的方法,导致上述看起来理智的代码实例创建NullPointerException
s.
您得到的唯一警告可能会发生这种情况是 JavaDoc 的onInitialize()
:
注意:此调用的时间不准确,约定是在 {@link Component#onBeforeRender()} 之前的某个时间调用它。