Мы избегали этого предупреждения 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
s.
Единственное предупреждение, которое вы можете получить, это JavaDoc onInitialize()
:
ПРИМЕЧАНИЕ. Время этого вызова не точное, договор заключается в том, что он вызывается за некоторое время до {@link Component # onBeforeRender ()}.