Мы избегаем этого предупреждения PMD, перемещая большую часть нашего кода конструктора в onInitialize()
. Но мы просто переместим проблему (дефект дизайна?) В разное место?Калитка и метод конструктора вызывает переопределяемый метод Предупреждение PMD
Является нашим onInitialize()
просто суррогатным конструктором, который не замечен PMD?
У нас возникли проблемы сорта, возникающие при вызове переопределяемых методов в конструкторе, но это, по-видимому, связано с тем, что сам Wicket называет один (не может найти точную строку источника, но onInitialize()
, overridable method, заканчивается тем, что вызывается при вызове 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 Компонент № onBeforeRender()}.
Да, для меня это звучит как дефект дизайна. Тем не менее, это полезно, чтобы обеспечить конкретную вещь. –
Также смотрите: http://stackoverflow.com/questions/4914151 –
Если вы просматриваете форумы Wicket (http://apache-wicket.1842946.n4.nabble.com/VOTE-WICKET-3218-Component-onInitialize- is-broken-for-Pages-tc3341090.html # none), вы увидите, что это признанная и обсуждаемая проблема. – jbrookover