Você definitivamente deve preferir criar um novo objeto no grande maioria dos casos. Problemas com a reatribuição de todas as propriedades:
- Requer setters públicos em todas as propriedades, o que limita drasticamente o nível de encapsulamento que você pode fornecer
- Saber se você tem algum uso adicional para a instância antiga significa que você precisa saber em todos os lugares que a instância antiga está sendo usada. Então, se classe
A
e classeB
são instâncias passadas da classe C
, elas precisam saber se alguma vez serão passadas à mesma instância e, se sim, se a outra ainda a está usando. Isso une fortemente classes que, de outra forma, não têm razão de existir.
- Leva a códigos repetidos - como gbjbaanb indicou, se você adicionar um parâmetro ao construtor, em qualquer lugar que chamar o construtor não será compilado, não haverá perigo de perder um local. Se você adicionar uma propriedade pública, precisará encontrar e atualizar manualmente todos os locais onde os objetos são "redefinidos".
- Aumenta a complexidade. Imagine que você está criando e usando uma instância da classe em um loop. Se você usar seu método, agora precisará fazer a inicialização separada na primeira vez no loop ou antes de iniciar o loop. De qualquer maneira, é necessário escrever um código adicional para dar suporte a essas duas maneiras de inicializar.
- Significa que sua classe não pode se proteger de estar em um estado inválido. Imagine que você escreveu um
Fraction
classe com um numerador e denominador e queria reforçar que ela sempre fosse reduzida (ou seja, o MDC do numerador e denominador era 1). Isso é impossível de fazer bem, se você deseja permitir que as pessoas definam publicamente o numerador e o denominador, pois elas podem passar por um estado inválido para passar de um estado válido para outro. Por exemplo, 1/2 (válido) -> 2/2 (inválido) -> 2/3 (válido).
- Não é idiomático para o idioma em que você está trabalhando, aumentando o atrito cognitivo para quem mantém o código.
Todos esses são problemas bastante significativos. E o que você recebe em troca do trabalho extra que você cria é ... nada. A criação de instâncias de objetos é, em geral, incrivelmente barata, portanto o benefício de desempenho quase sempre será totalmente desprezível.
Como a outra resposta mencionada, o único momento em que o desempenho pode ser uma preocupação relevante é se a sua turma fizer algum trabalho significativamente caro na construção. Mas, mesmo nesse caso, para que essa técnica funcione, você precisará separar a parte cara das propriedades que está redefinindo, para poder usar o padrão flyweight ou similar.
Como uma observação lateral, alguns dos problemas acima podem ser mitigados de certa forma por não usar setters e, em vezpublic Reset
método em sua classe que os mesmos parâmetros do construtor. Se, por algum motivo, você quiser seguir essa rota de redefinição, provavelmente seria uma maneira muito melhor de fazê-lo.
Ainda assim, a complexidade e repetição adicionais que adicionam, juntamente com os pontos acima que ela não aborda, ainda são um argumento muito convincente contra fazê-lo, especialmente quando pesadas em relação aos benefícios inexistentes.