Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida com Objetos Imutáveis + JPA + frameworks MVC

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?

3 respostas
solução!

Acho que entendi a sua dúvida. Talvez você saiba apenas parte da verdade sobre objetos imutáveis.

Em suma, quando falamos em imutabilidade significa que qualquer operação de modificação em um objeto, no lugar de alterar a sua referência, cria um novo objeto.

Você já trabalha com objetos imutáveis em Java faz tempo. A própria classe String é imutável. Daí você vai se perguntar: mas Flávio, mas eu mudo String o tempo todo, como ela pode ser imutável? Basta consultar sua API. Qualquer operação que você faça em String, ela não muda a String, pelo contrário, ela retorna um novo objeto String.

``` String palavra = "Flávio";

palavra.toUpperCase();

System.out.println(palavra);

```

A palavra não fica em uppercase, porque String é imutável. Para você realmente colocar o valor em caixa alta, você precisa capturar a nova string criada:

``` String palavra = "Flávio";

palavra = palavra.toUpperCase();

System.out.println(palavra); ```

Isso acontece com todos os tipos wrappers em Java. Então, String é imutável certo? Mas mudou, mas não é que ela tenha mudado, ela criou um novo objeto para você.

Talvez seja por isso que não coube na sua cabeça o lance de objetos imutáveis + JPA.

Pode ser que eu tenha viajado na resposta, mas é assim que eu enxergo a sua pergunta e o seu problema.

E realmente, se você quiser levar isso ao extremo, em uma aplicação com JSF e JPA, você não poderá fazer o binding direto, precisará de uma classe intermediária (um VO). Quando esse cara intermediário receber os dados você pode criar um método que cria uma nova instância da entidade.

É aquela velha questão do que deveria ser e o que é. O que você prefere? Expor seu domínio direto na view ou escondê-lo? Vai arcar com o trabalho extra, vale a pena? Qual problema isso vai resolver na sua aplicação? São perguntas que trazem o problema mais parte do realidade e não apenas aplicar aquilo que dizem que é melhor.

Valeu Flávio, não viajou na resposta não, na verdade queria levantar uma discussão justamente onde vc diz "problema mais parte do realidade e não apenas aplicar aquilo que dizem que é melhor", com certeza existem situações onde trabalhar com imutabilidade traz inúmeros benefícios ,mas analisando bem em se tratando de entidades do JPA não vejo muita necessidade, na maioria dos casos um bom encapsulamento é o suficiente para proteger o domínio .

Excelente Ricardo! Agora é continuar a se aprofundar no tema! Abraço e bom estudo (e almoço também, pela hora :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software