aplnas:
Pessoal,
Apesar desta ser minha primeira mensagem, já acompanho o fórum a uns 6 meses.
Gostaria de tirar uma dúvida e ao mesmo saber se meu raciocínio está correto.
Um dos grandes pilares da Orientação a Objetos é o Encapsulamento.
Mas como encapsular todos os atributos de uma classe se temos que persisti-la? (acho que agora não tem acento)
Não importa se utilizamos um DAO ou um Repository e etc.
Como garantir que apenas este tipo de classe tenha acesso a informação que não quero que seja exposta para o resto do sistema?
Simples, use o padrão Memento.
Básicamente a sua classe persistivel tem uma classe irma ( o memento) no mesmo pacote.
O memento tem acesso ao interior do objeto porque está no mesmo pacote. Ele então copia/escreve esse estado quando necessário.
O seu sistema de persistencia persiste mementos. Eles podem implementar algum tipo de interface genérica para que o sistema de persistencia os entenda ( algo como Persistable get/setValue(String nomeDoCampo))
Claro que vc pode fazer o sistema de persistencia criar o memento dinamicamente via reflection. Assim, ele apenas têm que consulta o objeto original usando get/set padrão do objeto e copiar para o memento dinamico. Em ultimissimo caso pode usar leitura directa dos atributos, mas cuidado que isso viola o encapsulamento ( que é o que vc não quer fazer. E está certo em não querer)
O Hibernate utiliza o padrão memento dinamico através da criação de um proxy do objeto original ( o memento é o proxy da classe que é uma copia do objeto original).