Por que o JSF chama getters várias vezes

Digamos que eu especifique um componente outputText como este:

<h:outputText value="#{ManagedBean.someProperty}"/>

Se eu imprimir uma mensagem de log quando o getter forsomeProperty é chamado e carrega a página, é trivial notar que o getter está sendo chamado mais de uma vez por solicitação (duas ou três vezes foi o que aconteceu no meu caso):

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

Se o valor desomeProperty é caro calcular, isso pode ser um problema.

Pesquisei um pouco no Google e percebi que esse é um problema conhecido. Uma solução alternativa era incluir uma verificação e verificar se ela já havia sido calculada:

private String someProperty;

public String getSomeProperty() {
    if (this.someProperty == null) {
        this.someProperty = this.calculatePropertyValue();
    }
    return this.someProperty;
}

O principal problema disso é que você recebe um monte de código padrão, sem mencionar variáveis particulares que talvez você não precise.

Quais são as alternativas para essa abordagem? Existe uma maneira de conseguir isso sem tanto código desnecessário? Existe uma maneira de impedir que o JSF se comporte dessa maneira?

Obrigado pela sua contribuição!

questionAnswers(8)

yourAnswerToTheQuestion