我們一直通過將大部分構造函數代碼移動到onInitialize()
來避免此PMD警告。但是,我們只是將問題(設計缺陷?)轉移到一個不同的地方?Wicket和'構造函數調用可重寫的方法'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()
方法,這是一種可覆蓋的方法,可導致上述看起來正常的代碼創建NullPointerException
s的實例。
唯一的警告你,這可能發生是onInitialize()
的JavaDoc:
注意:此通話的時間是不準確的,合同是,它是{@link之前有時稱爲組件#onBeforeRender()}。
是的,對我來說這聽起來像是一個設計缺陷。儘管如此,它還是很好的提供一些具體的東西。 – 2011-06-09 11:04:56
另請參見:http://stackoverflow.com/questions/4914151 – 2011-06-09 11:14:36
如果您閱讀Wicket論壇(http://apache-wicket.1842946.n4.nabble.com/VOTE-WICKET-3218-Component-onInitialize- is-broken-for-Pages-tc3341090.html#none),你會發現這是一個公認和爭論的問題。 – jbrookover 2011-06-10 13:41:26