18.6. Value Object
Objeto pequeno, comparado pelo valor, imutável.
Resumo
- Objeto pequeno cuja igualdade vem dos valores dos campos, não de identidade. Ex.: Dinheiro, Data, Período.
- Deve ser imutável: alterar = criar outro. Evita aliasing (dois donos compartilhando e mudando o mesmo).
- Sobrescreva equals/hashCode com base nos campos.
- No banco: Embedded Value ou Serialized LOB; sem Identity Field nem Identity Map.
- Não confundir com o 'Value Object' do J2EE antigo, que era DTO.
Perguntas-chave
responda de cabeça, depois abraPor que Value Objects devem ser imutáveis?
Para evitar aliasing: se dois objetos compartilham o mesmo valor, mudar um não pode afetar o outro.
Como se compara dois Value Objects?
Pelo conteúdo dos campos (equals baseado em valor).
Como persistir um Value Object?
Normalmente com Embedded Value nas colunas do dono.
Exercícios de fixação
0/5 respondidas1.
new Dinheiro(10, "BRL").equals(new Dinheiro(10, "BRL")) retorna true. Que tipo de objeto é Dinheiro?2.
Dois pedidos compartilham o mesmo objeto
Data. Um deles muda o dia com data.setDia(5) e o outro pedido também muda. Qual o erro?3.
Qual a forma usual de mapear um Value Object no banco?
4.
Qual a diferença central entre entidade e Value Object?
5.
Na comunidade J2EE antiga, 'Value Object' era usado com outro sentido. Qual?