コンストラクター コードのほとんどを に移動することで、この PMD 警告を回避してきました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
です。
これが発生する可能性があるという唯一の警告は、次の JavaDoc ですonInitialize()
。
注:この呼び出しのタイミングは正確ではありません。{@link Component#onBeforeRender()} の前に呼び出されるという契約があります。