Warum JSF Getter mehrfach aufruft
Angenommen, ich gebe eine outputText-Komponente wie folgt an:
<h:outputText value="#{ManagedBean.someProperty}"/>
Wenn ich beim Getter für eine Logmeldung druckesomeProperty
wird aufgerufen und die Seite geladen, ist es trivial zu bemerken, dass der Getter mehr als einmal pro Anfrage aufgerufen wird (zweimal oder dreimal ist das, was in meinem Fall passiert ist):
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
Wenn der Wert vonsomeProperty
ist teuer in der Berechnung, dies kann möglicherweise ein Problem sein.
Ich habe ein bisschen gegoogelt und festgestellt, dass dies ein bekanntes Problem ist. Eine Problemumgehung bestand darin, eine Überprüfung einzuschließen und festzustellen, ob diese bereits berechnet wurde:
private String someProperty;
public String getSomeProperty() {
if (this.someProperty == null) {
this.someProperty = this.calculatePropertyValue();
}
return this.someProperty;
}
Das Hauptproblem dabei ist, dass Sie jede Menge Code für das Boilerplate erhalten, ganz zu schweigen von privaten Variablen, die Sie möglicherweise nicht benötigen.
Was sind die Alternativen zu diesem Ansatz? Gibt es eine Möglichkeit, dies ohne unnötigen Code zu erreichen? Gibt es eine Möglichkeit, JSF davon abzuhalten, sich auf diese Weise zu verhalten?
Danke für deinen Beitrag!