Estou pensando em fazer um sistema que aproveite ao máximos os objetos, que possa fazer um cache deles e reutilizá-los sem problemas.
Uma forma de ajudar a evitar problemas de performance, concorrência e distribuição dos objetos seria fazer com que os objetos sejam imutáveis, ou seja, caso algum dado neles mude, um novo objeto é criado, e o método que o alterou(ou pediu a alteração) recebe esse novo objeto, deixando a versão antiga dela intacta para o resto do sistema.
Bem, isso é fácil de fazer com os wrappers dos tipos de dados, Strings, BigIntegers, e com objetos-valor (Fowler). Entretanto, como faço isso para algo maior e mais complexo, como Pessoas, Produtos, que tem nomes, datas e uma série de dados extras dentro deles?
O problema que vejo é que a cada chamada que altera o objeto, ele retorna um novo objeto. E com múltiplas alterações em série, seriam dezenas de chamadas para criação de novos objetos… Por outro lado, ter um method chaining até que é bom para aumentar a legibilidade, mas é algo a ser estudado.
Uma das minhas maiores preocupações é uma maneira muito fácil de isso ser usado, sem ficar brigando com a linguagem nem escrevendo muito código.
Algum pensamento sobre assunto? Usar Factories, Builders, padrões de construção? Ou soluções mais simples para este reaproveitamento?
A grande sacada é você se perguntar: Dados dois objetos da classe Xyz com os mesmos valores em seus atributos, eles podem ser intercambiáveis? Se forem dois objetos do tipo Cor, sim, isto é, dois objetos que não tem nada a ver com o outro podem apontar para o mesmo objeto representando o Amarelo. Por outro lado, dois objetos do tipo Pessoa com os mesmos valores nos seus atributos não são intercambiáveis. Você pode ter duas Pessoas com o mesmo nome e data de nascimento, mas cada instância representa uma pessoa diferente.