Estudando sobre OO li em vários lugares que seria uma boa prática utilizar objetos imutáveis, pois eles oferecem várias vantagens sobre os objetos mutáveis tais como:
- Seguro em multi-threading;
- Podem ser usados com segurança como chaves de hashmaps e sets;
- Podem ser compartilhados entre múltiplos objetos (padrão Flyweight);
Para o objeto ser imutável ele deve seguir algumas premissas como:
- Não possuir setters
- Classe deve ser final
- Todos os campos devem ser privados
A minha dúvida é em relação em tornar os objetos imutáveis quando utilizamos JPA associados, quando utilizamos JSF por exemplo(poderia ser outro framework mvc), a não ser que você use um VO, não passamos os atributos para o model via construtor, preenchemos os atributos dos objetos em um formulário na pagina xhtml e o binding do jsf copia os valores digitados no objetos atravé dos metodos setters. Mas se o objeto for imutável e não tem setters como o jsf vai conseguir preencher esse objeto?
Outra dúvida pertinente é em relação ao update. Objetos imutáveis não sofrem alteração no seu estado, mas no dia a dia com JPA + JSF é comum termos além da tela de cadastro, uma tela de alteração,em algum momento, algum estado terá que ser modificado, ou seu programa não faz nada.Mas se o objeto é imutável como vou modificar seus atributos?